Есть ли хороший способ перебора символов строки? Я хотел бы быть в состоянии сделать 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);
Есть ли:
A) Способ сделать строку итерируемой
B) Лучший способ построить массив символов из строки (и если да, как насчет другого направления?)
Я чувствую, что мне здесь не хватает чего-то очевидного.
php
string
character-arrays
jon_darkstar
источник
источник
array_filter
в этом смысле, можно было бы лучше сделать с помощью строковых функций или функций reg-exОтветы:
Шаг 1: преобразуйте строку в массив с помощью
str_split
функции$array = str_split($your_string);
Шаг 2: прокрутите вновь созданный массив
Вы можете проверить документацию PHP для получения дополнительной информации:
str_split
источник
str_split() will split into bytes, rather than characters when dealing with a multi-byte encoded string.
- Значитstr_split
нельзя работать с UnicodeИтерировать строку:
источник
strlen()
каждую итерацию. Ничего страшного, так как PHP имеет предварительно вычисленную длину, но все же вызов функции. Если вам нужна скорость, лучше сохраните ее в переменной перед запуском цикла.Если ваши строки находятся в Unicode, вы должны использовать
preg_split
с/u
модификаторомИз комментариев в документации php:
источник
mb_split
это более надежно.Вы также можете просто получить доступ к $ s1 как к массиву, если вам нужен только доступ к нему:
источник
Расширенный из ответа @SeaBrightSystems, вы можете попробовать это:
источник
Для тех, кто ищет самый быстрый способ перебора строк в php, Ive подготовил тестовое тестирование.
Первый метод, в котором вы напрямую обращаетесь к строковым символам, указывая их позицию в скобках и обрабатывая строку как массив:
Я сам думал, что последний метод самый быстрый, но ошибался.
Как и во втором методе (который используется в принятом ответе):
Этот метод будет быстрее, потому что мы используем реальный массив, а не предполагаем, что это массив.
Вызов последней строки каждого из вышеуказанных методов на
1000000
время приводит к следующим результатам тестирования:Использование строки [i]
0.24960017204285 Seconds
Использование str_split
0.18720006942749 Seconds
Это означает, что второй метод намного быстрее.
источник
Хм ... Не надо ничего усложнять. Основы всегда отлично работают.
Прямое направление:
Выходы:
abcdef
Обратное направление:
Выходы:
fedcba
источник
источник
Большинство ответов забыли о неанглийских символах !!!
strlen
подсчитывает БАЙТЫ, а не символы, поэтому это так, и его родственные функции отлично работают с английскими символами, поскольку английские символы хранятся в 1 байте как в кодировках UTF-8, так и в кодировках ASCII, вам необходимо использовать функции многобайтовых строкmb_*
Это будет работать с любым символом, закодированным в
UTF-8
Это выводит
источник