PHP - 迭代字符串字符

新手上路,请多包涵

有没有一种很好的方法来迭代字符串的字符? I’d like to be able to do foreach , array_map , array_walk , array_filter etc. on the characters of a string.

类型转换/杂耍没有让我到任何地方(将整个字符串作为数组的一个元素),我发现的最佳解决方案是简单地使用 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)从字符串构建字符数组的更好方法(如果是这样,另一个方向呢?)

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

原文由 jon_darkstar 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 358
2 个回答

使用 str_split 迭代 ASCII 字符串(PHP 5.0 起)

如果您的字符串 包含 ASCII(即“英语”)字符,则使用 str_split

 $str = 'some text';
foreach (str_split($str) as $char) {
    var_dump($char);
}

使用 mb_str_split 迭代 Unicode 字符串(自 PHP 7.4 起)

如果您的字符串 可能 包含 Unicode(即“非英语”)字符,那么您必须使用 mb_str_split

 $str = 'μυρτιὲς δὲν θὰ βρῶ';
foreach (mb_str_split($str) as $char) {
    var_dump($char);
}

原文由 SeaBrightSystems 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

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

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

// 8 characters in 12 bytes
$string = "abcdأبتث";

$charsCount = mb_strlen($string, 'UTF-8');
for($i = 0; $i < $charsCount; $i++){
    $char = mb_substr($string, $i, 1, 'UTF-8');
    var_dump($char);
}

输出

string(1) "a"
string(1) "b"
string(1) "c"
string(1) "d"
string(2) "أ"
string(2) "ب"
string(2) "ت"
string(2) "ث"

原文由 Accountant م 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题