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
Owe*_*wen 70
迭代字符串:
for ($i = 0; $i < strlen($str); $i++){
echo $str[$i];
}
Run Code Online (Sandbox Code Playgroud)
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)
如果只需要访问它,您也可以像数组一样访问$ s1:
$s1 = "hello world";
echo $s1[0]; // -> h
Run Code Online (Sandbox Code Playgroud)
大多数答案都忘记了非英文字符!
\n\nstrlen
计算字节,而不是字符,这就是它的原因,它的兄弟函数可以很好地处理英文字符,因为英文字符在 UTF-8 和 ASCII 编码中都存储在 1 个字节中,您需要使用多字节字符串函数 mb_*
这适用于编码的任何字符UTF-8
// 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\nstring(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
从@SeaBrightSystems回答扩展,你可以试试这个:
$s1 = "textasstringwoohoo";
$arr = str_split($s1); //$arr now has character array
Run Code Online (Sandbox Code Playgroud)
对于那些正在寻找在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