Разбить массив на несколько массивов по порядку в 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];
}
}