Объясните, как работает эта пользовательская функция Переполнение стека

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

6

Решение

Массивы $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, Итерация будет продолжаться до тех пор, пока все массивы не станут пустыми

2

Другие решения

внутри array_zip_merge, за оператор всегда принимает первые значения каждого массива и добавляет их в выход переменная соответственно.

Так как array_shift удаляет возвращаемый элемент, в каждом цикле первые элементы различны. Когда он становится пустым из-за этого, цикл не имеет ничего общего и разрывается.

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

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector