PHP – 迭代string字符
是否有一个很好的方法来迭代string的字符? 我希望能够对string的字符做foreach
, array_map
, array_walk
, array_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; }