Вот эта функция в PHP, которая позволяет объединять любое количество N массивов разной длины таким образом, чтобы выходной массив был в следующем порядке: Array1[0],Array2[0],..,ArrayN[0],Array1[1],Array2[1],..,ArrayN[1]...
:
function array_zip_merge() {
$output = array();
// The loop incrementer takes each array out of the loop as it gets emptied by array_shift().
for ($args = func_get_args(); count($args); $args = array_filter($args)) {
// &$arg allows array_shift() to change the original.
foreach ($args as &$arg) {
$output[] = array_shift($arg);
}
}
return $output;
}
// test
$a = range(1, 10);
$b = range('a', 'f');
$c = range('A', 'B');
echo implode('', array_zip_merge($a, $b, $c)); // prints 1aA2bB3c4d5e6f78910
Хотя я понимаю, что каждая из встроенных функций в этом примере делает самостоятельно, я просто не могу понять, как все это работает вместе в этой функции, несмотря на включенные поясняющие комментарии …
Может кто-нибудь сломать это для меня, пожалуйста? Функция прекрасно работает как есть, она просто сводит меня с ума, что я не понимаю, как она работает …
P.S: эта функция взята из Чередование нескольких массивов в один массив вопрос.
Массивы $a
, $b
а также $c
имеют 10, 6 и 2 элемента соответственно.
$a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
$b = ['a', 'b', 'c', 'd', 'e', 'f'];
$c = ['A', 'B'];
Когда вы подаете массивы в качестве аргументов для array_zip_merge()
функция, посмотрите на for
петля. func_get_args()
установит $args
со всеми предоставленными аргументами. На старте первого for
цикл запуска,
$args = [$a, $b, $c];
count($args) = 3;
На foreach
зациклить array_shift
вернет первый элемент каждого массива в результате $output
быть как
$output = [1, 'a', 'A'];
И массивы теперь выглядят так,
$a = [2, 3, 4, 5, 6, 7, 8, 9, 10];
$b = ['b', 'c', 'd', 'e', 'f'];
$c = ['B'];
В конце первого for
зациклить array_filter
Функция проверит, является ли какой-либо массив пустым, и удалит его из $args
, То же самое произойдет во втором прогоне, и к концу второго for
цикл, переменные будут выглядеть
$a = [3, 4, 5, 6, 7, 8, 9, 10];
$b = ['c', 'd', 'e', 'f'];
$c = [];
$output = $output = [1, 'a', 'A', 2, 'b', 'B'];
//because $c is empty array_filter() removes it from $args
$args = [$a, $b];
Итак, на третьей итерации for
петля count($args)
вернусь 2
, Когда последний элемент $b
был удален array_shift
count($args)
вернусь 1
, Итерация будет продолжаться до тех пор, пока все массивы не станут пустыми
внутри array_zip_merge, за оператор всегда принимает первые значения каждого массива и добавляет их в выход переменная соответственно.
Так как array_shift удаляет возвращаемый элемент, в каждом цикле первые элементы различны. Когда он становится пустым из-за этого, цикл не имеет ничего общего и разрывается.
Если вы все еще не понимаете, пожалуйста, спросите конкретную часть кода, с которой у вас возникли проблемы.