significato - cercare nelle stringhe php



PHP-iterare su caratteri stringa (5)

Espanso dalla risposta di @SeaBrightSystems, puoi provare questo:

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

C'è un modo carino per iterare sui personaggi di una stringa? Mi piacerebbe essere in grado di fare foreach , array_map , array_walk , array_filter , ecc. array_filter caratteri di una stringa.

Digitare casting / juggling non mi ha portato da nessuna parte (metti l'intera stringa come un elemento dell'array), e la soluzione migliore che ho trovato è semplicemente usare un ciclo for per costruire l'array. Sembra che ci dovrebbe essere qualcosa di meglio. Voglio dire, se puoi indicizzare su di esso non dovresti essere in grado di ripetere anche tu?

Questo è il migliore che ho

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);

C'è o:

A) Un modo per rendere la stringa iterabile
B) Un modo migliore per costruire l'array di caratteri dalla stringa (e se sì, che dire dell'altra direzione?)

Mi sento come se mi mancasse qualcosa di ovvio qui.


Answer #1

Per coloro che sono alla ricerca del modo più veloce per scorrere le stringhe in php, Ive ha preparato un test di benchmark.
Il primo metodo in cui accedi ai caratteri della stringa direttamente specificando la sua posizione tra parentesi e trattando la stringa come una matrice:

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

Io stesso pensavo che quest'ultimo fosse il metodo più veloce, ma mi sbagliavo.
Come con il secondo metodo (che viene utilizzato nella risposta accettata):

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

Questo metodo sarà più veloce perché stiamo usando un array reale e non assumendo che uno sia un array.

Chiamando l'ultima riga di ciascuno dei metodi sopra indicati per 1000000 volte si è 1000000 a questi risultati di benchmarking:

Usando la stringa [i]
0.24960017204285 Seconds

Utilizzando str_split
0.18720006942749 Seconds

Il che significa che il secondo metodo è molto più veloce.


Answer #2

Se le tue stringhe sono in Unicode, dovresti usare preg_split con il modificatore /u

Dai commenti nella documentazione php:

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

Answer #3

Stringa di iterazione:

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

Answer #4
// 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;
}




character-arrays