PHP - 迭代字符串字符

jon*_*tar 107 php string character-arrays

有没有一种很好的方法来迭代字符串的字符?我希望能够做到foreach,array_map,array_walk,array_filter等一个字符串的字符.

类型转换/杂耍没有让我到处(将整个字符串作为数组的一个元素),我发现的最佳解决方案是使用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);
Run Code Online (Sandbox Code Playgroud)

有没有:

A)使字符串可迭代的一种方法
B)从字符串构建字符数组的更好方法(如果是这样,另一个方向怎么样?)

我觉得我错过了一些明显的东西.

小智 154

第1步:使用该str_split函数将字符串转换为数组

$array = str_split($your_string);

第2步:循环遍历新创建的数组

foreach ($array as $char) {
 echo $char;
}
Run Code Online (Sandbox Code Playgroud)

您可以查看PHP文档以获取更多信息: str_split

  • `str_split() 在处理多字节编码字符串时将拆分为字节,而不是字符。` - 所以 `str_split` 不能与 Unicode 一起使用 (2认同)
  • `mb_str_split` 将是多字节等效项。`$array = mb_str_split($your_string);` (2认同)

Owe*_*wen 70

迭代字符串:

for ($i = 0; $i < strlen($str); $i++){
    echo $str[$i];
}
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是一个更好的答案,因为它回答了问题 - 即如何迭代字符串而不是'转换为数组'. (5认同)
  • 这就是答案.世界有什么问题? (5认同)
  • 只需注意,您在每次迭代时都调用`strlen()`。这不是一件可怕的事情,因为PHP已经预先计算了长度,但是仍然是一个函数调用。如果需要速度,最好在开始循环之前将其保存在变量中。 (5认同)
  • @OmarTariq *“这就是答案。世界出了什么问题?”* ....世界的错误是世界上除了英语之外还有其他语言,这个函数正如 alvery 所说将迭代字符串中的字节,不是角色。 (4认同)
  • 大声笑!!!!!一切@OmarTariq.这比提供的答案更有效. (2认同)
  • 这对多字节字符串不利,因为在这里我们得到的是字节偏移量,而不是符号 (2认同)

Daw*_*hia 19

如果你的字符串是用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 ); 
} 
Run Code Online (Sandbox Code Playgroud)

  • 对于多字节字符串,`mb_split` 更可靠。 (2认同)

Mor*_*tur 9

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

$s1 = "hello world";
echo $s1[0]; // -> h
Run Code Online (Sandbox Code Playgroud)


Acc*_*t م 9

大多数答案都忘记了非英文字符!

\n\n

strlen计算字节,而不是字符,这就是它的原因,它的兄弟函数可以很好地处理英文字符,因为英文字符在 UTF-8 和 ASCII 编码中都存储在 1 个字节中,您需要使用多字节字符串函数 mb_*

\n\n

这适用于编码的任何字符UTF-8

\n\n
// 8 characters in 12 bytes\n$string = "abcd\xd8\xa3\xd8\xa8\xd8\xaa\xd8\xab";\n\n$charsCount = mb_strlen($string, \'UTF-8\');\nfor($i = 0; $i < $charsCount; $i++){\n    $char = mb_substr($string, $i, 1, \'UTF-8\');\n    var_dump($char);\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

输出

\n\n
string(1) "a"\nstring(1) "b"\nstring(1) "c"\nstring(1) "d"\nstring(2) "\xd8\xa3"\nstring(2) "\xd8\xa8"\nstring(2) "\xd8\xaa"\nstring(2) "\xd8\xab"\n
Run Code Online (Sandbox Code Playgroud)\n


Dai*_*dow 6

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

$s1 = "textasstringwoohoo";
$arr = str_split($s1); //$arr now has character array
Run Code Online (Sandbox Code Playgroud)


Ami*_*ein 6

对于那些正在寻找在PHP中迭代字符串的最快方法的人,我已经准备了一个基准测试.
您可以通过在括号中指定其位置并将字符串视为数组来直接访问字符串字符的第一种方法:

$string = "a sample string for testing";
$char = $string[4] // equals to m
Run Code Online (Sandbox Code Playgroud)

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

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

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

按时间调用上述每种方法的最后一行1000000会产生以下基准测试结果:

使用字符串[i]
0.24960017204285 Seconds

使用str_split
0.18720006942749 Seconds

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


小智 5

嗯……没必要把事情复杂化。基础工作总是很好。

    $string = 'abcdef';
    $len = strlen( $string );
    $x = 0;
Run Code Online (Sandbox Code Playgroud)

前进方向:

while ( $len > $x ) echo $string[ $x++ ];
Run Code Online (Sandbox Code Playgroud)

输出: abcdef

反向:

while ( $len ) echo $string[ --$len ];
Run Code Online (Sandbox Code Playgroud)

输出: fedcba