PHP – 迭代string字符

是否有一个很好的方法来迭代string的字符? 我希望能够对string的字符做foreacharray_maparray_walkarray_filter等。

types铸造/杂耍没有让我到任何地方(把整个string作为数组的一个元素),我发现最好的解决scheme是简单地使用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)一种使string可迭代的方法
B)从string中构build字符数组的更好的方法(如果是这样,那么另一个方向呢?)

我觉得我在这里错过了一些明显的东西。

什么str_split

如果你的string是Unicode的,你应该用/u修饰符来使用preg_split

从php文档中的注释:

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

迭代string:

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

从@SeaBrightSystems的答案扩展,你可以试试这个:

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

你也可以像数组一样访问$ s1,如果你只需要访问它:

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

对于那些正在寻找在php中迭代string的最快方法,我准备了一个基准testing。
第一种方法是直接通过在括号中指定其位置并像string一样处理string来访问string:

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

我本人认为后者是最快的方法,但我错了。
与第二种方法(在接受的答案中使用)一样:

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

这个方法会更快,因为我们使用一个真正的数组,而不是假设一个数组。

调用上述每种方法的最后一行1000000次导致这些基准testing结果:

使用string[i]
0.24960017204285 Seconds

使用str_split
0.18720006942749 Seconds

这意味着第二种方法更快。

 // 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; }