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

tra*_*rad 5 javascript php array-map

array_map要求$array输入作为最后一个或多个参数。 array_filterarray_reduce采取$array输入作为第一个参数。作为对比示例,当您在JavaScript中调用映射,过滤或精简数组时,回调函数签名看起来像

(current, index, array) => {…}
Run Code Online (Sandbox Code Playgroud)

Array.prototype.reduce 将结转值作为第一个参数,但仍无法在JavaScript方法中混淆参数的顺序。

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

是否array_map仅仅因为您可以提供任意数量的数组(可变变量)而将数组作为最后一个参数?是否可以通过array_map比具有更统一的函数签名的回调函数来馈送任意数量的数组?

编辑/评论:

从Wikipedia来看,这可以看出PHP已经发展了多长时间:

“早期PHP并不是要成为一种新的编程语言,而是有机地发展起来的,Lerdorf回顾道:“我不知道如何制止它,从来没有意图编写一种编程语言[…]我绝对不知道如何编写编程语言,我只是不断增加下一步的逻辑步骤。” 一个开发团队开始组建,经过几个月的工作和beta测试,于1997年11月正式发布了PHP / FI2。PHP 并不是最初设计的,而是经过有机开发的,这导致功能的命名不一致和命令的顺序不一致。他们的参数。 在某些情况下,选择函数名称以匹配PHP正在“包装”的较低级库,而在某些非常早期的PHP版本中,函数名称的长度在内部用作哈希函数,因此选择名称是为了改善散列值的分布。”

Chr*_*nce 1

array_map 是否将数组作为最后一个参数,仅仅是因为您可以提供任意数量的数组(可变参数)?

是的; 只有方法签名中的最后一个参数可以是可变参数。

通过 array_map 的回调函数提供任意数量的数组的能力是否比拥有更统一的函数签名更重要?

本质上,这是询问是否array_map应该接受多个数组。有一些很好的用例允许调用array_map多个数组;下面是 PHParray_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);
Run Code Online (Sandbox Code Playgroud)

如果将 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);
}
Run Code Online (Sandbox Code Playgroud)