Existe-t-il une bonne manière d'itérer sur les caractères d'une chaîne? Je voudrais être en mesure de le faire foreach
, array_map
, array_walk
, array_filter
etc. sur les caractères d'une chaîne.
Le type casting / jonglage ne m'a amené nulle part (mettez la chaîne entière comme un élément du tableau), et la meilleure solution que j'ai trouvée consiste simplement à utiliser une boucle for pour construire le tableau. On a l'impression qu'il devrait y avoir quelque chose de mieux. Je veux dire, si vous pouvez l'indexer, ne devriez-vous pas être capable d'itérer également?
C'est le meilleur que j'ai
function stringToArray($s)
{
$r = array();
for($i=0; $i<strlen($s); $i++)
$r[$i] = $s[$i];
return $r;
}
$s1 = "textasstringwoohoo";
$arr = stringToArray($s1); //$arr now has character array
$ascval = array_map('ord', $arr); //so i can do stuff like this
$foreach ($arr as $curChar) {....}
$evenAsciiOnly = array_filter( function($x) {return ord($x) % 2 === 0;}, $arr);
Y a-t-il soit:
A) Un moyen de rendre la chaîne itérable
B) Une meilleure façon de construire le tableau de caractères à partir de la chaîne (et si oui, qu'en est-il de l'autre sens?)
J'ai l'impression de manquer quelque chose d'évident ici.
la source
array_filter
dans ce sens pourrait être mieux fait avec des fonctions string ou reg-exRéponses:
Étape 1: convertir la chaîne en tableau à l'aide de la
str_split
fonction$array = str_split($your_string);
Étape 2: parcourez le tableau nouvellement créé
Vous pouvez consulter la documentation PHP pour plus d'informations:
str_split
la source
str_split() will split into bytes, rather than characters when dealing with a multi-byte encoded string.
- Jestr_split
ne peux donc pas travailler avec UnicodeItérer la chaîne:
la source
strlen()
à chaque itération. Pas une chose terrible, puisque PHP a la longueur précalculée, mais toujours un appel de fonction. Si vous avez besoin de vitesse, mieux vaut l'enregistrer dans une variable avant de démarrer la boucle.Si vos chaînes sont en Unicode, vous devez utiliser
preg_split
avec le/u
modificateurÀ partir des commentaires dans la documentation php:
la source
mb_split
c'est plus fiable.Vous pouvez également accéder simplement à $ s1 comme un tableau, si vous avez seulement besoin d'y accéder:
la source
Développé à partir de la réponse @SeaBrightSystems, vous pouvez essayer ceci:
la source
Pour ceux qui recherchent le moyen le plus rapide d'itérer des chaînes en php, j'ai préparé un test de référence.
La première méthode dans laquelle vous accédez directement aux caractères de chaîne en spécifiant sa position entre crochets et en traitant la chaîne comme un tableau:
J'ai moi-même pensé que cette dernière était la méthode la plus rapide, mais je me suis trompé.
Comme pour la deuxième méthode (qui est utilisée dans la réponse acceptée):
Cette méthode va être plus rapide car nous utilisons un tableau réel et ne supposons pas qu'un tableau est un tableau.
L'appel de la dernière ligne de chacune des méthodes ci-dessus pour les
1000000
temps conduit à ces résultats d'analyse comparative:Utilisation de la chaîne [i]
0.24960017204285 Seconds
Utilisation de str_split
0.18720006942749 Seconds
Ce qui signifie que la deuxième méthode est beaucoup plus rapide.
la source
Hmm ... Il n'y a pas besoin de compliquer les choses. Les bases fonctionnent toujours très bien.
Direction avant:
Les sorties:
abcdef
Direction inverse:
Les sorties:
fedcba
la source
la source
La plupart des réponses ont oublié les caractères non anglais !!!
strlen
compte BYTES, pas les caractères, c'est pourquoi c'est le cas et ses fonctions frères fonctionnent bien avec les caractères anglais, car les caractères anglais sont stockés dans 1 octet dans les encodages UTF-8 et ASCII, vous devez utiliser les fonctions de chaîne multioctetsmb_*
Cela fonctionnera avec n'importe quel caractère encodé en
UTF-8
Cette sortie
la source