Объясните, как работает эта настраиваемая функция PHP

Здесь эта функция в 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: эта функция берется из чередования нескольких массивов в один вопрос с массивом .

Solutions Collecting From Web of "Объясните, как работает эта настраиваемая функция PHP"

Массивы $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 удаляет возвращаемый элемент, в каждом цикле первые элементы различаются. Когда он становится пустым из-за этого, цикл не имеет ничего общего и разрывается.

Если вы все еще не понимаете, спросите конкретную часть кода, с которым вы столкнулись, пожалуйста.