Почему array_map () со значением null в качестве обратного вызова создает & quot; массив массивов & quot ;?

Сегодня я узнал об особом случае 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
)

)

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

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

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

$d = array_map(function() { return func_get_args(); }, $a, $b, $c);

Но почему кто-то хочет или ожидает это как поведение по умолчанию? Есть ли техническая причина, по которой это так работает, как побочный эффект от реализации? Или это было случайное решение «давайте сделаем эту функцию еще одной вещью» (глядя на вас, array_multisort())?

7

Решение

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

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

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

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

Других решений пока нет …

По вопросам рекламы [email protected]