PHP - itérer sur les caractères de la chaîne
Est-il un bon moyen pour itérer sur les caractères d'une chaîne? J'aimerais être capable de faire foreach
, array_map
, array_walk
, array_filter
etc. sur les caractères d'une chaîne.
Type coulée/jonglage, na pas me faire n'importe où (à mettre l'ensemble de la chaîne comme un élément du tableau), et la meilleure solution que j'ai trouvé est tout simplement à l'aide d'une boucle for pour construire le tableau. Il se sent comme il doit y avoir quelque chose de mieux. Je veux dire, si vous pouvez l'index ne devriez-vous pas être en mesure d'effectuer une itération ainsi?
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);
Est là, soit:
A) Un moyen de rendre la chaîne d'itérable
B) Une meilleure façon de construire le tableau de caractères à partir de la chaîne (et si oui, comment au sujet de l'autre sens?)
Je me sens comme im manque quelque chose ici évidente.
- Peut-être devriez vous en dire plus au sujet de ce que vous essayez d'accomplir... il semble qu'il pourrait y avoir une meilleure façon de le faire en utilisant la normale des opérations de chaîne.
- n'avez pas un réel objectif. juste une curiosité j'ai été jouer avec. semblait bizarre que même si vous pouvez indice de chaînes de caractères, vous ne pouvez pas effectuer une itération. j'étais à une perte à même de penser que jusqu'exemple significatif utilise, mais je voudrais savoir si il est possible d'itérer sur les chaînes de caractères sans la construction d'un tableau de caractères explicitement
- c'est un bon point même si, évidemment, mes exemples sont assez peu profonde. ie - pour la plupart tout ce que vous feriez avec
array_filter
dans ce sens pourrait être fait de mieux avec de la ficelle ou de reg-ex fonctions - La résolution de projecteuler.net/problem=20 peut-être un exemple (même si un peu artificiel) de cas d'utilisation.
- une remarque, concernant for($i=0; $i<strlen($s); $i++) je voudrais stocker le strlen($s) dans une variable avant la boucle, de cette façon, vous n'aurez pas appeler strlen() plus de 1 heure
Vous devez vous connecter pour publier un commentaire.
Étape 1: convertir la chaîne en un tableau à l'aide de la
str_split
fonction$array = str_split($your_string);
Étape 2: boucle à travers l'ensemble nouvellement créé
Vous pouvez vérifier l'PHP docs pour plus d'informations:
str_split
Itération de la chaîne:
strlen()
à chaque itération. Pas une chose terrible, depuis PHP a la longueur prédéterminée, mais encore un appel de fonction. Si vous avez besoin de vitesse, de mieux enregistrer dans une variable avant de commencer la boucle.Si vos cordes sont en Unicode, vous devez utiliser
preg_split
avec/u
modificateurDe commentaires dans la documentation php:
mb_split
est plus fiable.Vous pouvez aussi accéder à $s1 comme un tableau, si vous avez seulement besoin d'accéder:
Élargi à partir de @SeaBrightSystems réponse, vous pouvez essayer ceci:
Pour ceux qui sont à la recherche de la façon la plus rapide pour effectuer une itération sur les chaînes en php, j'ai préparé un test d'évaluation.
La première méthode dans laquelle vous accédez à la chaîne de caractères directement en spécifiant sa position entre parenthèses et de traitement de chaîne de caractères comme un tableau:
J'ai moi-même pensé que la dernière est la méthode la plus rapide, mais j'avais tort.
Comme avec la seconde méthode (qui est utilisé dans la accepté de répondre):
Cette méthode sera plus rapide parce que nous sommes à l'aide d'un réel tableau et en n'assumant pas un être un tableau.
L'appel de la dernière ligne de chacune des méthodes ci-dessus pour
1000000
fois conduisent à ces résultats de l'analyse comparative:L'aide de la chaîne[i]
0.24960017204285 Seconds
À l'aide de str_split
0.18720006942749 Seconds
Ce qui signifie que la deuxième méthode est plus rapide.
Hmm... Il n'y a pas besoin de compliquer les choses. Les principes de base de l'excellent travail toujours.
Sens De La Marche:
Sorties:
abcdef
Sens Inverse:
Sorties:
fedcba
La plupart des réponses oublié les caractères non anglais !!!
strlen
compte OCTETS, pas de caractères, c'est pourquoi il est, ainsi que son frère fonctions fonctionne très bien avec les caractères en anglais, car l'anglais caractères sont stockés dans 1 octet à la fois de l'UTF-8 et ASCII codage, vous devez utiliser le fonctions de chaînes de caractères multi-octetsmb_*
Cela fonctionne avec tout caractère codé en
UTF-8
Ce sorties