Gibt es eine gute Möglichkeit, die Zeichen einer Zeichenfolge zu durchlaufen? Ich möchte in der Lage sein zu tun foreach
, array_map
, array_walk
, array_filter
usw. auf den Zeichen einer Zeichenkette.
Typ Casting / Jonglieren brachte mich nicht weiter (setzen Sie den gesamten String als ein Element des Arrays), und die beste Lösung, die ich gefunden habe, ist einfach die Verwendung einer for-Schleife zum Erstellen des Arrays. Es fühlt sich an, als ob es etwas Besseres geben sollte. Ich meine, wenn Sie darauf indizieren können, sollten Sie dann nicht auch iterieren können?
Das ist das Beste, was ich habe
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);
Gibt es entweder:
A) Eine Möglichkeit, die Zeichenfolge iterierbar zu machen
B) Eine bessere Möglichkeit, das Zeichenarray aus der Zeichenfolge zu erstellen (und wenn ja, wie wäre es mit der anderen Richtung?)
Ich habe das Gefühl, dass mir hier etwas Offensichtliches fehlt.
quelle
array_filter
in diesem Sinne tun würden, könnte besser mitAntworten:
Schritt 1: Konvertieren Sie die Zeichenfolge mithilfe der
str_split
Funktion in ein Array$array = str_split($your_string);
Schritt 2: Durchlaufen Sie das neu erstellte Array
Sie können die PHP-Dokumente für weitere Informationen überprüfen:
str_split
quelle
str_split() will split into bytes, rather than characters when dealing with a multi-byte encoded string.
-str_split
Kann also nicht mit Unicode arbeitenIterierte Zeichenfolge:
quelle
strlen()
jede Iteration aufrufen . Keine schreckliche Sache, da PHP die Länge vorberechnet hat, aber immer noch ein Funktionsaufruf. Wenn Sie Geschwindigkeit benötigen, speichern Sie diese besser in einer Variablen, bevor Sie die Schleife starten.Wenn Ihre Zeichenfolgen in Unicode sind, sollten Sie
preg_split
mit verwenden/u
Modifikator verwendenAus Kommentaren in der PHP-Dokumentation:
quelle
mb_split
zuverlässiger.Sie können auch einfach wie ein Array auf $ s1 zugreifen, wenn Sie nur darauf zugreifen müssen:
quelle
Ausgehend von der Antwort von @SeaBrightSystems können Sie Folgendes versuchen:
quelle
Für diejenigen, die nach dem schnellsten Weg suchen, um über Strings in PHP zu iterieren, habe ich einen Benchmark-Test vorbereitet.
Die erste Methode, bei der Sie direkt auf Zeichenfolgenzeichen zugreifen, indem Sie ihre Position in Klammern angeben und Zeichenfolgen wie ein Array behandeln:
Ich selbst dachte, Letzteres sei die schnellste Methode, aber ich habe mich geirrt.
Wie bei der zweiten Methode (die in der akzeptierten Antwort verwendet wird):
Diese Methode wird schneller sein, da wir ein reales Array verwenden und nicht davon ausgehen, dass es sich um ein Array handelt.
Das Aufrufen der letzten Zeile jeder der oben genannten Methoden für
1000000
Zeiten führt zu folgenden Benchmarking-Ergebnissen:Verwenden von string [i]
0.24960017204285 Seconds
Mit str_split
0.18720006942749 Seconds
Was bedeutet, dass die zweite Methode viel schneller ist.
quelle
Hmm ... Es besteht keine Notwendigkeit, Dinge zu komplizieren. Die Grundlagen funktionieren immer gut.
Vorwärtsrichtung:
Ausgänge:
abcdef
Rückwärtsrichtung:
Ausgänge:
fedcba
quelle
quelle
Die meisten Antworten haben nicht englische Zeichen vergessen !!!
strlen
zählt BYTES, nicht Zeichen, deshalb funktioniert es und seine Geschwisterfunktionen funktionieren gut mit englischen Zeichen, da englische Zeichen sowohl in UTF-8- als auch in ASCII-Codierungen in 1 Byte gespeichert sind, müssen Sie die Multibyte-Zeichenfolgenfunktionen verwendenmb_*
Dies funktioniert mit jedem in codierten Zeichen
UTF-8
Dies gibt aus
quelle