wake-up-neo.net

PHP - iterate auf Zeichenfolgen

Gibt es eine nette Möglichkeit, die Zeichen einer Zeichenfolge zu durchlaufen? Ich möchte foreach, array_map, array_walk, array_filter usw. für die Zeichen einer Zeichenfolge ausführen können.

Typ Casting/Jonglieren brachte mich nicht überall hin (setzen Sie die gesamte Zeichenfolge als ein Element des Arrays ein), und die beste Lösung, die ich gefunden habe, ist die Verwendung einer for-Schleife, um das Array zu erstellen. Es fühlt sich an, als sollte es etwas Besseres geben. Ich meine, wenn Sie indexieren 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 Zeichen-Array 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 offensichtlich fehlt.

88
jon_darkstar

Schritt 1: Konvertieren Sie den String mit der Funktion _str_split_ in ein Array

$array = str_split($your_string);

Schritt 2: Durchlaufen Sie das neu erstellte Array

_foreach ($array as $char) {
 echo $char;
}
_

Sie können die PHP -Dokumente auf weitere Informationen überprüfen: str_split

144

Zeichenfolge iterieren:

for ($i = 0; $i < strlen($str); $i++){
    echo $str[$i];
}
48
Owen

Wenn Ihre Zeichenfolgen in Unicode vorliegen, sollten Sie preg_split mit dem Modifikator /u verwenden 

Aus den Kommentaren in der PHP-Dokumentation:

function mb_str_split( $string ) { 
    # Split at all position not after the start: ^ 
    # and not before the end: $ 
    return preg_split('/(?<!^)(?!$)/u', $string ); 
} 
19
Hadi Di Wao

Sie können auch wie ein Array auf $ s1 zugreifen, wenn Sie nur darauf zugreifen müssen:

$s1 = "hello world";
echo $s1[0]; // -> h
8
Moritur

Ausgehend von der Antwort von @SeaBrightSystems könnten Sie Folgendes versuchen:

$s1 = "textasstringwoohoo";
$arr = str_split($s1); //$arr now has character array
5
Dairy Window

Für diejenigen, die den schnellsten Weg suchen, Strings in PHP zu durchlaufen, hat Ive einen Benchmark-Test vorbereitet.
Die erste Methode, bei der Sie direkt auf Zeichenfolgenzeichen zugreifen, indem Sie deren Position in Klammern angeben und die Zeichenfolge wie ein Array behandeln:

$string = "a sample string for testing";
$char = $string[4] // equals to m

Ich selbst dachte, letztere sei die schnellste Methode, aber ich lag falsch.
Wie bei der zweiten Methode (die in der akzeptierten Antwort verwendet wird):

$string = "a sample string for testing";
$string = str_split($string);
$char = $string[4] // equals to m

Diese Methode wird schneller sein, da wir ein reales Array verwenden und nicht, dass eines als Array gilt. 

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 

Verwenden von str_split
0.18720006942749 Seconds

Was bedeutet, dass die zweite Methode viel schneller ist.

5
TechJS

Hmm ... Man muss die Dinge nicht komplizieren. Die Grundlagen funktionieren immer gut. 

    $string = 'abcdef';
    $len = strlen( $string );
    $x = 0;

Vorwärtsrichtung:  

while ( $len > $x ) echo $string[ $x++ ];

Ausgänge: abcdef

Umgekehrte Richtung:

while ( $len ) echo $string[ --$len ];

Ausgänge: fedcba

0
Ash

Die meisten Antworten haben nicht englische Zeichen vergessen !!!

strlen zählt BYTES, also keine Zeichen, und seine Geschwisterfunktionen funktionieren auch gut mit englischen Zeichen, da englische Zeichen sowohl in UTF-8- als auch in ASCII-Codierungen in 1 Byte gespeichert sind müssen die Multibyte-String-Funktionenmb_* verwenden

Dies funktioniert mit beliebigen Zeichen, die in UTF-8 codiert sind.

$string = "abcdأبتث";

$charsCount = mb_strlen($string, 'UTF-8');
for($i = 0; $i < $charsCount; $i++){
    $char = mb_substr($string, $i, 1, 'UTF-8');
    var_dump($char);
}

Dies Ausgänge

string(1) "a"
string(1) "b"
string(1) "c"
string(1) "d"
string(2) "أ"
string(2) "ب"
string(2) "ت"
string(2) "ث"
0
Accountant م
// Unicode Codepoint Escape Syntax in PHP 7.0
$str = "cat!\u{1F431}";

// IIFE (Immediately Invoked Function Expression) in PHP 7.0
$gen = (function(string $str) {
    for ($i = 0, $len = mb_strlen($str); $i < $len; ++$i) {
        yield mb_substr($str, $i, 1);
    }
})($str);

var_dump(
    true === $gen instanceof Traversable,
    // PHP 7.1
    true === is_iterable($gen)
);

foreach ($gen as $char) {
    echo $char, PHP_EOL;
}
0
masakielastic