Почему подпись функции отличается между array_map и array_filter / array_reduce?

array_map просит $array введите в качестве последнего параметра (ов). array_filter а также array_reduce принимать $array введите в качестве первого параметра. В качестве контрастного примера, когда вы вызываете map, фильтруете или уменьшаете массив в JavaScript, сигнатуры функций обратного вызова выглядят как

(current, index, array) => {…}

Array.prototype.reduce принимает значение переноса в качестве первого параметра, но все еще невозможно смешать порядок параметров в методах JavaScript.

Я знаю, что PHP не является функционально ориентированным, но мне интересно, какие дизайнерские решения привели к подписи для array_map и т.п.

Есть ли array_map принять массив в качестве последнего параметра просто потому, что вы можете подавать столько массивов, сколько хотите (переменная)? Имеет ли возможность передавать произвольное количество массивов через функцию обратного вызова array_map перевесить наличие более однородных сигнатур функций?

РЕДАКТИРОВАТЬ / Комментарий:

из Википедии это показывает, как долго развивался PHP:

«Ранний PHP не был задуман как новый язык программирования, и вырос
органично, с ретроспективным замечанием Лердорфа: «Я не знаю, как
остановить это, никогда не было никакого намерения написать язык программирования
[…] Я понятия не имею, как написать язык программирования, я
просто продолжал добавлять следующий логический шаг на пути «. Команда разработчиков
начал формироваться и, после месяцев работы и бета-тестирования, официально
выпустила PHP / FI 2 в ноябре 1997 года. Дело в том, что PHP не было
первоначально разработан, но вместо этого был разработан органически, привело к
непоследовательное именование функций и непоследовательное упорядочение их
параметры.
В некоторых случаях имена функций были выбраны, чтобы соответствовать
библиотеки более низкого уровня, которые PHP «упаковывал», в то время как в некоторых очень
В ранних версиях PHP использовалась длина имен функций
внутренне как хеш-функция, поэтому имена были выбраны для улучшения
распределение хеш-значений. ‘

3

Решение

Принимает ли массив array_map массив в качестве последнего параметра просто потому, что вы можете передать столько массивов, сколько хотите (переменная)?

Да; только последний параметр в сигнатуре метода может быть переменным.

Перевешивает ли возможность подачи произвольного числа массивов через функцию обратного вызова array_map более однородные сигнатуры функций?

По сути, это спрашивает, если array_map должен принимать несколько массивов. Есть хорошие варианты использования для разрешения звонка array_map с несколькими массивами; ниже приведен пример из PHP array_map руководство, которое я немного изменил:

<?php
function showLanguages($n, $s, $g)
{
return("The number $n is called $s in Spanish and $g in German.");
}

$a = array(1, 2, 3, 4, 5);
$b = array("uno", "dos", "tres", "cuatro", "cinco");
$c = array("eins", "zwei", "drei", "vier", "funf");

$d = array_map("showLanguages", $a, $b, $c);
print_r($d);

Что если массив_карт был изменен, чтобы иметь многомерный массив в качестве первого аргумента? Хотя это технически сделало бы сигнатуры функций более однородными, на самом деле это добавило бы некоторые дополнительные проблемы.

Базовый код должен был бы не только проверить, что первый аргумент является массивом, но и подтвердить, что это массив массивов. Это сделало бы его по существу параметром другого типа, чем просто массив, так что это еще быть другой сигнатурой метода, чем другие методы array_ *.

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

/*
* Accepts a variable number of arrays as the first N arguments, takes a callback as the last argument
*/
function map()
{
$args = func_get_args();

$callback = array_pop($args);

array_unshift($args, $callback);

return call_user_func_array("array_map", $args);
}
1

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

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

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