Почему функция array map () с null в качестве обратного вызова создает "массив массивов"?


Сегодня я узнал о специальном случае array_map() в PHP, который упоминается в качестве примечания в документации:

Пример #4 Создание массива массивов

<?php
$a = array(1, 2, 3, 4, 5);
$b = array("one", "two", "three", "four", "five");
$c = array("uno", "dos", "tres", "cuatro", "cinco");

$d = array_map(null, $a, $b, $c);
print_r($d);
?>

Приведенный выше пример выведет:

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => one
            [2] => uno
        )

    [1] => Array
        (
            [0] => 2
            [1] => two
            [2] => dos
        )

    [2] => Array
        (
            [0] => 3
            [1] => three
            [2] => tres
        )

    [3] => Array
        (
            [0] => 4
            [1] => four
            [2] => cuatro
        )

    [4] => Array
        (
            [0] => 5
            [1] => five
            [2] => cinco
        )

)

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

(попробуйте)

Но это все. Больше никаких объяснений. Я понимаю, что это делает то же самое, что и

$d = array_map(function() { return func_get_args(); }, $a, $b, $c);
Но почему кто-то должен хотеть или ожидать такого поведения по умолчанию? Есть ли техническая причина, почему это работает так, как побочный эффект от имплемтации? Или это было просто случайное решение "давайте заставим эту функцию сделать еще одну вещь" (глядя на вас, array_multisort())?
1 7

1 ответ:

Это, по-видимому, частный случай в _array_map_, но он только документирован в этом примере. NULL обычно не допускается в качестве обратного вызова (если вы пытаетесь использовать его с call_user_func(), он сообщает об ошибке), но это разрешено в _array_map()_. Он трактует NULL как означающий, что он должен просто создать массив аргументов.

Это полезно, потому что array также недопустимо в качестве обратного вызова, потому что это языковая конструкция, а не функция. Поэтому вы не можете написать:

$d = array_map('array', $a, $b, $c);