为什么array_map和array_filter / array_reduce之间的函数签名不同?

时间:2016-06-02 22:15:15

标签: javascript php array-map

array_map要求将$array输入作为最后一个参数。 array_filterarray_reduce$array输入作为第一个参数。作为一个对比的例子,当您在JavaScript中调用map,filter或reduce数组时,回调函数签名看起来像

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

Array.prototype.reduce将残留值作为第一个参数,但仍然无法混淆参数' JavaScript方法中的顺序。

我知道PHP不是面向功能的,但我想知道导致array_map等签名的设计决策是什么。

array_map是否将数组作为最后一个参数,因为您可以根据需要提供任意数量的数组(可变参数)?通过array_map的回调函数提供任意数量的数组的能力是否超过了更均匀的函数签名?

编辑/评论:

来自维基百科,这可以看出PHP的发展时间有多长:

  

'早期的PHP并不打算成为一种新的编程语言,而且还在增长   有机地,Lerdorf回想起来了:"我不知道怎么做   停止它,从来没有任何编写语言的意图   [...]我完全不知道如何编写编程语言,我   只是不断添加下一个合乎逻辑的步骤。"一个开发团队   开始形成,经过数月的工作和beta测试,正式开始   1997年11月发布了PHP / FI 2. 事实证明PHP不是   最初的设计,但相反是有机发展导致   函数命名不一致,命令不一致   参数。 在某些情况下,选择函数名称来匹配   低级库,PHP是"包装",而在某些非常   PHP的早期版本使用了函数名称的长度   在内部作为哈希函数,因此选择名称来改进   哈希值的分布。'

1 个答案:

答案 0 :(得分:1)

  

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_map更改为将多维数组作为第一个参数,该怎么办?虽然它在技术上会使函数签名更加统一,但它实际上会增加一些额外的问题。

底层代码不仅要验证第一个参数是数组,还必须验证它是数组的数组。这将使它基本上是一个不同于一个数组的参数,所以它仍然是一个与其他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);
}