Разбить массив на несколько массивов по порядку в PHP

Массив ввода:

$input_array = array('a', 'b', 'c', 'd', 'e','f','g','h');

Желаемый вывод (например, 4 массива):

Array(
    'a',
    'e'
)

Array(
    'b',
    'f'
)

Array(
    'c',
    'g'
)

Array(
    'd',
    'h'
)

Как видите, это другой вывод, чем array_chunk. Я хочу по порядку заполнить различные массивы, один за другим, когда они достигнут последнего массива, вернуться к первому массиву и повторять до тех пор, пока не исчезнут значения.

Я пробовал так много возможностей, но не могу найти хорошую.

4 ответа

Решение

Вы можете перебрать свои значения и заполнить массив, используя модуль:

$input_array = array('a', 'b', 'c', 'd', 'e','f','g','h');
$arrs = [];
$key = 0;
foreach ($input_array as $val) {
    $arrs[$key++ % 4][] = $val;
}

// $arrs contains what you want.

// Then you could extract them in separate arrays.
list($a1, $a2, $a3, $a4) = $arrs;
var_dump($a1, $a2, $a3, $a4);

Выходы:

array(2) {
  [0]=> string(1) "a"
  [1]=> string(1) "e"
}
array(2) {
  [0]=> string(1) "b"
  [1]=> string(1) "f"
}
array(2) {
  [0]=> string(1) "c"
  [1]=> string(1) "g"
}
array(2) {
  [0]=> string(1) "d"
  [1]=> string(1) "h"
}
$a = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];

for($i = 0, $res = []; $i < $l = count($a); $res[$i % 4] = [$a[($i + 4) % $l], $a[$i]], $i++);

print_r($res);

Однострочники не обязательно хороши для читабельности, и тот факт, что это требует объяснения, означает, что это не очень хороший ответ для кода, который нужно поддерживать, но

$result = array_map(null, ...array_chunk($input_array, count($input_array) / 2));

Первая часть разбивает входной массив, не используя 2 - что даст массив с 2 столбцами данных - но даст 2 строки данных, поэтому начальный ввод будет преобразован в

array(2) {
  [0]=>
  array(4) {
    [0]=>
    string(1) "a"
    [1]=>
    string(1) "b"
    [2]=>
    string(1) "c"
    [3]=>
    string(1) "d"
  }
  [1]=>
  array(4) {
    [0]=>
    string(1) "e"
    [1]=>
    string(1) "f"
    [2]=>
    string(1) "g"
    [3]=>
    string(1) "h"
  }
}

... Оператор в PHP передает массив аргументов тоже как функцию, как если бы они были отдельными аргументами, поэтому эффективно передает две строки из массива как отдельные аргументы массива.

призвание array_map() с null обратный вызов выполняет "транспонирование" аргументов массива, как описано для примера № 4 в PHP Docs для функции, которая преобразует массив 2x4 в примере в массив 4x2, давая

array(4) {
  [0]=>
  array(2) {
    [0]=>
    string(1) "a"
    [1]=>
    string(1) "e"
  }
  [1]=>
  array(2) {
    [0]=>
    string(1) "b"
    [1]=>
    string(1) "f"
  }
  [2]=>
  array(2) {
    [0]=>
    string(1) "c"
    [1]=>
    string(1) "g"
  }
  [3]=>
  array(2) {
    [0]=>
    string(1) "d"
    [1]=>
    string(1) "h"
  }
}

Цикл по индексу, увеличиваясь на количество выходных массивов, которые вы хотите. Затем используйте внутренний цикл, чтобы получить отдельные элементы.

$len = count($input_array);
$output_array = [[], [], [], []];
$stride = count($output_array);
for ($i = 0; $i < $len; $i += $stride) {
    for ($j = 0; $j < $stride && $i + $j < $len; $j++) {
        $output_array[$j][] = $input_array[$i + $j];
    }
}
Другие вопросы по тегам