Массив ввода:
$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. Я хочу по порядку заполнить различные массивы, один за другим, когда они достигнут последнего массива, вернуться к первому массиву и повторять до тех пор, пока не останется больше значений.
Я пробовал так много возможностей, но не могу найти хорошую.
Вы можете перебрать свои значения и заполнить массив, используя модуль:
$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"}
Однострочники не обязательно хороши для читабельности, и тот факт, что это требует объяснения, означает, что это не очень хороший ответ для кода, который нужно поддерживать, но
$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 Документы для функции, который преобразует массив 2×4 в примере в массив 4×2, давая
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];
}
}
$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);