Aller au contenu

gestion de caractères


Sujets conseillés

Posté

bonjour ...

je cherche à améliorer un certain code php qui me fait un "tri" sur une chaine de caractères, qui se trouve être un nom de fichier.

Le nom de fichier est écrit ainsi : fichier_AAAAMM.ext

Le code que j'ai créé pour récupèrer la valeur AAAAMM est celui-ci (mais je le trouve trop lourd...) :

$xploz = explode("_", $var); 
$xplod = explode('.', $xploz[1]);
$date = $xplod[0];

Je suis sûr qu'il y a bien mieux (ayant peu dormi, j'ai du mal, j'avoue :P )

N'est-ce pas ?

Posté

Peut-être que:

$var=ereg_replace(".*_(.*)\.ext","\\1",$var);

serait plus rapide ? A essayer !

Dan

Posté

Si les dates sont toujours codees sur 6 chiffres, la methode suivante est plus rapide :

$date = substr($var, 8, 6);

Voici un petit script pour verifier et comparer differentes methodes :

<?
set_time_limit(999);

for ($j=1; $j<=4; $j++)
{
$debut = explode(' ',microtime());
$debut = $debut[1]+$debut[0];
for ($i=0; $i<500000; $i++) //500.000 iterations
{
$var = 'fichier_AAAAMM.ext';
switch ($j)
{
case 1 : $date=ereg_replace(".*_(.*)\.ext","\\1",$var); break; // temps: 25.42s
case 2 : $date = substr($var, 8, 6);// temps: 1.14s
case 3 : list($fichier, $date, $ext) = split('[_.]', $var); break; // temps: 2.78s
default : $xploz = explode('_', $var); $xplod = explode('.', $xploz[1]); $date = $xplod[0]; break; // temps: 2.73s
}
}
$fin = explode(' ',microtime());
$fin = $fin[1]+$fin[0];
$temps_passe = $fin-$debut;
print "resultat $j: $date<br />";
echo "temps: $temps_passe<hr />";
}
?>

Et la proposition de Dan est plus lente que la formulation de depart :)

Posté (modifié)
Peut-être que:

$var=ereg_replace(".*_(.*)\.ext","\\1",$var);

serait plus rapide ? A essayer !

Dan

meric, Dan...

je penchais assez pour une solution de ce genre, mais je doutais ;)

Et merci pour avoir supprimer le doublon involontaire !

Si les dates sont toujours codees sur 6 chiffres, la methode suivante est plus rapide :

$date = substr($var, 8, 6);

(...)

Et la proposition de Dan est plus lente que la formulation de depart :)

Eh, beh là je suis bluffé ...

je retiens ton petit script assez intéressant au demeurant.

Ensuite que substr dans ce contexte soit plus rapide que ereg ne m'étonne pas ...

D'autant que pour mémoire, le site php.net recommande justement d'utiliser de préférence les fonctions *str* que *reg* car moins gourmand en ressources.

Un petit script en fournit une preuve ... chapeau !

Modifié par ste
Posté

La sous-chaîne (substr) est effectivement plus rapide, mais cela présume que c'est toujours au même emplacement que se trouve la date.

J'avais toutefois dit "... serait plus rapide ? A essayer !" C'était donc "sous réserve de vérification" ;)

Si c'est toujours précédé par "fichier_" ... on est d'accord. Sinon, c'est peut-être plus rapide mais cela ne donnera pas la bonne valeur :whistling:

Posté
La sous-chaîne (substr) est effectivement plus rapide, mais cela présume que c'est toujours au même emplacement que se trouve la date.

J'avais toutefois dit "... serait plus rapide ? A essayer !" C'était donc "sous réserve de vérification" ;)

Si c'est toujours précédé par "fichier_" ... on est d'accord. Sinon, c'est peut-être plus rapide mais cela ne donnera pas la bonne valeur :whistling:

Disons que la chaine de caractères précédant la date est connue et est toujours la meme...

Néanmoins ta remarque sur la valeur retournée est exact au cas où ela chaine de caractères serait différente !

merci à tous deux ...

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...