J'essaie d'écrire une fonction qui ajoute le signe # à un tableau de mots dans une chaîne
Étant donné que je peux utiliser le str_replace pour chacun d'eux, mais mon tableau s'agrandit et ce n'est pas efficace.
/ p>
$needles = array('a', 'c', 'd'); $haystack = 'a b c d e f g'; foreach($needles as $what) { if(strpos($haystack, $what)!==false) { $haystack = str_replace($needles, '#'.$what.'-', $haystack); } } echo $haystack;
Le tableau ici est des aiguilles acd dans une botte de foin de abcdefg J'essaye de les rendre #a #b #c pour que le résultat soit #a b #c #d e f g
3 Réponses :
Je ne sais pas si c'est plus rapide que vous deviez le comparer, mais cette solution fonctionne. Regex est lent, mais itérer une fois dans une chaîne devrait être plus rapide que la parcourir N fois.
#a b #c #d e f g
Sortie
<?php $needles = array('a', 'c', 'd'); $haystack = 'a b c d e f g'; $reg = '~(['.implode($needles).'])~'; echo preg_replace ( $reg, '#$1' , $haystack );
Vous utilisez mal cette fonction str_replace () Pour en savoir plus sur cette fonction, cliquez ici fonction str_replace
#a b #c #d e f g
Sortie
$needles = array('a', 'c', 'd'); $haystack = 'a b c d e f g'; foreach($needles as $key) { if(strpos($haystack, $key)!==false) { $haystack = str_replace($key, '#'.$key, $haystack); } } echo $haystack;
J'espère que cela vous aidera
Comment peut-il être optimisé:
donc ça va:
code:
$convertedStr = ''; foreach($converted as $convertedChar) { $convertedStr .= $convertedChar; } //and echo or save later echo $convertedStr;
donne :
//echo converted string char by char foreach($converted as $convertedChar) { echo $convertedChar; }
comment utiliser:
mettez la définition de function convert () {}
où vous voulez et utilisez-la plus tard:
# or use when haystack is in file $filePath = 'test-file.txt'; $fileResource = fopen($filePath, 'r'); $converted = convert($needles, $fileResource);
$ converti
est maintenant une sorte de tableau dont chaque élément est un caractère de la chaîne qui est convertie. Donc, pour faire écho à tous les caractères, vous le traitez comme un tableau
['#a', 'b', '#c', '#d', 'e', 'f', 'g']
et écho à l'intérieur de la boucle foreach:
//$converted = convert($needles, $haystack);
la bonne chose est que le "genre de tableau" n'est jamais créé il ne ressemble et se sent comme un tableau pour foreach
mais en fait il ne retourne qu'un seul caractère modifié pour chaque itération. Par conséquent, une consommation de mémoire de convert () n'est presque rien.
la deuxième approche (ad 3.) est de lire toute la meule de foin à partir d'un fichier et de la traiter à la volée. Cette approche peut gérer même une très grande botte de foin car elle ne la lit pas dans la mémoire à la fois et la stocke en entier avant le traitement, mais lit un caractère à partir de l'entrée, puis le change et fait écho, et un autre. bloc de code:
//echo converted string char by char foreach($converted as $convertedChar) { echo $convertedChar; }
et décommentez ceci:
$needles = array('a', 'c', 'd'); $haystack = 'a b c d e f g'; $converted = convert($needles, $haystack);
puis faites un écho comme avant avec foreach
#a b #c #d e f g
si vous voulez stocker le texte converti en chaîne, vous pouvez le faire comme ça:
<?php $needles = array('a', 'c', 'd'); $haystack = 'a b c d e f g'; function convert($needles, $haystack) { if(is_resource($haystack)) { $stream = $haystack; } else { $stream = fopen('data://text/plain,' . $haystack,'r'); } while($char = fgetc($stream)) { if(in_array($char, $needles)) { $result = '#' . $char; } else { $result = $char; } yield $result; } if(is_resource($stream)) { fclose($stream); } } # use with haystack as string $converted = convert($needles, $haystack); # or use when haystack is in file // $filePath = 'test-file.txt'; // $fileResource = fopen($filePath, 'r'); // $converted = convert($needles, $fileResource); //echo converted string char by char foreach($converted as $convertedChar) { echo $convertedChar; }
Quelle est la taille de votre tableau?