Как разбить строку на несколько массивов в PHP? - PullRequest
1 голос
/ 25 июня 2019

У меня есть строка вроде этого: $string = "1A1R0A", и я хочу разделить эту строку $ на 2 массива:

array1 ( 
    [0] => 1
    [1] => 1
    [2] => 0
)

array2 (
    [0] => A
    [1] => R
    [2] => A
)

Можете ли вы помочь мне сделать это?

У меня естьпопытался использовать str_split следующим образом:

$subs = str_split($string,1);

, но это не работает, потому что он сделает массив следующим образом:

Array ( 
    [0] => 1 
    [1] => A 
    [2] => 0 
    [3] => R 
    [4] => 1 
    [5] => A 
) 

Ответы [ 4 ]

3 голосов
/ 25 июня 2019

Вы можете использовать array_filter для фильтрации массива и сохранения тех же индексов символов и str_split для достижения этой цели.Затем просто верните, если символ is_numeric или нет.

Это также сохранит фактические индексные точки этих символов в исходной строке.

Live demo .

$str = "1A1R0A";

$arr = (object) array(
    'numeric' => array_filter(str_split($str), function($char) {
        return is_numeric($char);
    }),
    'character' => array_filter(str_split($str), function($char) {
        return !is_numeric($char);
    }),
);

// $arr->numeric will hold numeric values
// $arr->character will hold ascii values

Поддерживая индекс символа, вы можете определить, где в строке находится это числовое значение.

foreach($arr->numeric as $key => $value) {
    $pos = ++$key;
    echo "{$value} is position {$pos} in the String.";
}
2 голосов
/ 25 июня 2019

Вы можете использовать регулярные выражения для сопоставления всех шаблонов чисел, за которыми следуют не числа.

preg_match_all('/(\d+)(\D+)/', $string, $matches);

Ваши массивы цифр / букв будут в совпадениях.Вы можете работать с ними напрямую в $matches[1] и $matches[2] или извлекать их в более читаемый формат.

$result = array_combine(['numbers', 'letters'], array_slice($matches, 1));
1 голос
/ 25 июня 2019
$string = "1A1R0A";
$array = str_split($string);

$int_array = [];
$str_array = [];
foreach ($array as $char) {
     if (is_numeric($char)) $int_array[] = $char;
     else $str_array[] = $char;
}

Демо здесь

0 голосов
/ 22 июля 2019

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',
  ),
)
...