146

文字列の文字を反復処理する良い方法はありますか? 文字列の文字に対して、、、などを実行できるようforeachにしたいと思います。array_maparray_walkarray_filter

型キャスト/ジャグリングはどこにも行きませんでした (文字列全体を配列の 1 つの要素として配置します)。私が見つけた最良の解決策は、単純に for ループを使用して配列を構築することです。もっと良いものがあるべきだと感じています。つまり、インデックスを付けることができれば、反復もできるはずではありませんか?

これは私が持っている最高です

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

次のいずれかがありますか?

A) 文字列を反復可能にする方法
B) 文字列から文字配列を構築するより良い方法 (もしそうなら、他の方向はどうですか?)

ここで明らかな何かが欠けているように感じます。

4

9 に答える 9

216

ステップ 1:str_split関数を使用して文字列を配列に変換する

$array = str_split($your_string);

ステップ 2:新しく作成された配列をループする

foreach ($array as $char) {
 echo $char;
}

詳細については、PHP ドキュメントを確認してください。str_split

于 2011-01-05T05:20:57.053 に答える
113

文字列を繰り返します:

for ($i = 0; $i < strlen($str); $i++){
    echo $str[$i];
}
于 2016-10-24T09:30:17.290 に答える
21

文字列がUnicodeの場合は、修飾子preg_splitとともに使用する必要があります/u

PHPドキュメントのコメントから:

function mb_str_split( $string ) { 
    # Split at all position not after the start: ^ 
    # and not before the end: $ 
    return preg_split('/(?<!^)(?!$)/u', $string ); 
} 
于 2012-01-08T18:28:53.737 に答える
13

アクセスする必要がある場合は、配列のように $s1 にアクセスすることもできます。

$s1 = "hello world";
echo $s1[0]; // -> h
于 2016-02-18T21:47:20.303 に答える
7

PHP で文字列を反復処理する最速の方法を探している人のために、Ive はベンチマーク テストを用意しました。
括弧内に位置を指定し、文字列を配列のように扱うことにより、文字列文字に直接アクセスする最初の方法:

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

私自身、後者が最速の方法だと思っていましたが、間違っていました。
2番目の方法(受け入れられた回答で使用されている)と同様に:

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

この方法は、実際の配列を使用しており、配列であると想定していないため、より高速になります。

上記の各メソッドの最後の行を1000000時間で呼び出すと、次のベンチマーク結果が得られます。

string[i] の使用
0.24960017204285 Seconds

str_split の使用
0.18720006942749 Seconds

つまり、2 番目の方法の方が高速です。

于 2016-09-02T07:36:52.820 に答える
6

@SeaBrightSystemsの回答から拡張して、これを試すことができます:

$s1 = "textasstringwoohoo";
$arr = str_split($s1); //$arr now has character array
于 2015-05-15T07:55:14.087 に答える
3
// 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;
}
于 2016-08-29T05:04:53.297 に答える