Search code examples
phparraysstringiteration

Loop over each character in a string


Is there a nice way to iterate on the characters of a string? I'd like to be able to do foreach, array_map, array_walk, array_filter etc. on the characters of a string.

Type casting/juggling didnt get me anywhere (put the whole string as one element of array), and the best solution I've found is simply using a for loop to construct the array. It feels like there should be something better. I mean, if you can index on it shouldn't you be able to iterate as well?

This is the best I've got

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);

Is there either:

A) A way to make the string iterable
B) A better way to build the character array from the string (and if so, how about the other direction?)

I feel like im missing something obvious here.


Solution

  • Use str_split to iterate ASCII strings (since PHP 5.0)

    If your string contains only ASCII (i.e. "English") characters, then use str_split.

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

    Use mb_str_split to iterate Unicode strings (since PHP 7.4)

    If your string might contain Unicode (i.e. "non-English") characters, then you must use mb_str_split.

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