Здесь эта функция в 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
Хотя я понимаю, что каждая из встроенных функций в этом примере делает сама по себе, я просто не могу окунуться в мои мысли о том, как все это работает вместе в этой функции, несмотря на то, что включены объясняющие комментарии …
Может кто-нибудь сломает меня, пожалуйста? Функция работает отлично, как есть, ее просто сводит меня с ума, что я не понимаю, как это работает …
PS: эта функция берется из чередования нескольких массивов в один вопрос с массивом .
Массивы $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()
массивы в качестве аргументов функции array_zip_merge()
, посмотрите на цикл for
. Функция func_get_args()
установит $args
со всеми приведенными аргументами. При запуске первого цикла цикла,
$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'];
В конце первого цикла array_filter
функция array_filter
будет проверять, нет ли какого-либо массива и удалить его из $args
. То же самое произойдет во втором запуске, и к концу второго цикла цикла переменные будут выглядеть так:
$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];
Итак, на третьей итерации цикла цикла count($args)
возвращается 2
. Когда последний элемент $b
был удален array_shift
count($args)
вернет 1
. Итерация будет продолжаться до тех пор, пока все массивы не будут пустыми
Внутри array_zip_merge оператор for всегда принимает первые значения каждого массива и соответственно добавляет их к выходной переменной.
Поскольку array_shift удаляет возвращаемый элемент, в каждом цикле первые элементы различаются. Когда он становится пустым из-за этого, цикл не имеет ничего общего и разрывается.
Если вы все еще не понимаете, спросите конкретную часть кода, с которым вы столкнулись, пожалуйста.