PHP-对字符串进行迭代

PHP-对字符串进行迭代,php,string,character-arrays,Php,String,Character Arrays,有没有一种很好的方法来迭代字符串的字符?我希望能够对字符串的字符执行foreach,array\u map,array\u walk,array\u filter等操作 类型转换/杂耍并没有让我有任何进展(将整个字符串作为数组的一个元素),我发现最好的解决方案就是使用for循环来构造数组。感觉应该有更好的。我的意思是,如果你可以索引它,你不应该也可以迭代吗 这是我最好的了 function stringToArray($s) { $r = array(); for($i=0; $

有没有一种很好的方法来迭代字符串的字符?我希望能够对字符串的字符执行
foreach
array\u map
array\u walk
array\u 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);
函数stringToArray($s)
{
$r=数组();

对于($i=0;$i步骤1:使用
stru split
函数将字符串转换为数组

$array=str\u split($your\u string);

步骤2:循环新创建的数组

foreach ($array as $char) {
 echo $char;
}

您可以查看PHP文档以了解更多信息:

如果字符串是Unicode格式的,则应使用带有
/u
修饰符的
preg\u 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 ); 
} 
函数mb_str_split($string){
#在所有位置拆分而不是在开始之后:^
#而不是在结尾之前:$

返回从@SeaBrightSystems answer展开的preg_split('/(?),您可以尝试以下方法:

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

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

$s1 = "hello world";
echo $s1[0]; // -> h
//PHP 7.0中的Unicode码点转义语法
$str=“cat!\u{1F431}”;
//PHP7.0中的IIFE(立即调用的函数表达式)
$gen=(函数(字符串$str){
对于($i=0,$len=mbstrlen($str);$i<$len;++$i){
产量mb_substr($str,$i,1);
}
})($str);
瓦鲁垃圾场(
true==$gen instanceof Traversable,
//PHP7.1
真===可编辑($gen)
);
foreach($genas$char){
echo$char,PHP\u EOL;
}

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

$string = "a sample string for testing";
$char = $string[4] // equals to m
我自己认为后者是最快的方法,但我错了。
与第二种方法(在接受的答案中使用)一样:

这种方法会更快,因为我们使用的是实数数组,而不是假设其中一个是数组

调用上述每种方法的最后一行
1000000次
会得到以下基准测试结果:

使用字符串[i]
0.24960017204285秒

使用str_split
0.18720006942749秒

这意味着第二种方法要快得多。

迭代字符串:

for ($i = 0; $i < strlen($str); $i++){
    echo $str[$i];
}
for($i=0;$i
嗯……没有必要把事情复杂化。基本功总是很好的

$string='abcdef';
$len=strlen($string);
$x=0;
前进方向:

while($len>$x)echo$string[$x++];
输出:
abcdef

反向:

while($len)回显$string[--$len];

输出:
fedcba

大多数答案忘记了非英语字符

strlen
计算字节,而不是字符,这就是它的原因,它的同级函数可以很好地处理英文字符,因为英文字符在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);
}

也许你应该多说一下你正在努力完成的事情……似乎有更好的方法可以用普通的字符串操作来完成。这里没有真正的目标。只是出于好奇。虽然你可以对字符串进行索引,但却无法迭代,这似乎很奇怪。我甚至想不出有意义的例子uses,但我仍然想知道是否有某种方法可以在不构建字符数组的情况下对字符串进行迭代这是一个很好的观点,显然我的示例非常肤浅。也就是说,从这个意义上讲,使用
array\u filter
可以更好地使用字符串或reg-ex函数来处理mig这可能是一个示例(尽管有些做作)用例($i=0;$ihah哇,是的,就是这样。当然,内爆可以做另一个方向。我很快会接受这个,除非有人能找到一种方法来正确地进行迭代sting@jon_darkstar我不知道您的应用程序,但请注意数组中的每个条目都有很大的开销(4bytes IIRC)。跳过这一点,这是“相当”的方式:
str_split()将在处理多字节编码字符串时拆分为字节,而不是字符。
-因此
str_split
无法使用Unicode
mb_str_split
将是多字节等效。
$array=mb_str_split($your_string)
我不同意,这个答案确实很有价值,它给出了一个关于str_split如何在PHP应用程序中工作的工作示例。@SeaBrightSystems只是链接到文档,这有时在一个人试图查看函数如何工作时并没有多大帮助,举个例子。否则,大多数答案都是指向PHP.net的链接。这个seems喜欢一个更好的答案,因为它回答了一个问题,即如何迭代字符串而不是“转换为数组”。LOL!!!!!Everything@OmarTariq。这比提供的答案更有效。请注意,您正在调用
strlen()
每次迭代。这不是一件可怕的事情,因为PHP预先计算了长度,但仍然是一个函数调用。如果您需要速度,最好在开始循环之前将其保存在一个变量中。这对多字节字符串不好,因为这里我们获取的是字节偏移量,而不是symbol@OmarTariq “这就是答案。这个世界怎么了?”。
for ($i = 0; $i < strlen($str); $i++){
    echo $str[$i];
}
// 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) "ث"