preg_match_all()
обеспечивает прямую однофункциональную технику без зацикливания.
Захватывает цифры ($out[1]
) и сохраняет буквы в совпадении полной строки ($out[0]
).Нет ненужных подмассивов в $out
.
Код: ( Демо )
$string = "1A1R0A";
var_export(preg_match_all('~(\d)\K\D~', $string, $out) ? [$out[1], $out[0]] : [[], []]);
echo "\n--- or ---\n";
[$letters, $numbers] = preg_match_all('~(\d)\K\D~', $string, $out) ? $out : [[], []];
var_export($numbers);
echo "\n";
var_export($letters);
Вывод:
array (
0 =>
array (
0 => '1',
1 => '1',
2 => '0',
),
1 =>
array (
0 => 'A',
1 => 'R',
2 => 'A',
),
)
--- or ---
array (
0 => '1',
1 => '1',
2 => '0',
)
array (
0 => 'A',
1 => 'R',
2 => 'A',
)
Если вашСтрока может начинаться с буквы или ваша последовательность цифр и букв не может чередоваться, вы можете использовать эту прямую технику для разделения двух категорий символов.
Код: ( Демо )
$string = "B1A23R4CD";
$output = [[], []]; // ensures that the numbers array comes first
foreach (str_split($string) as $char) {
$output[ctype_alpha($char)][] = $char;
// ^^^^^^^^^^^^^^^^^^- false is 0, true is 1
}
var_export($output);
Вывод:
array (
0 =>
array (
0 => '1',
1 => '2',
2 => '3',
3 => '4',
),
1 =>
array (
0 => 'B',
1 => 'A',
2 => 'R',
3 => 'C',
4 => 'D',
),
)