array_map请求将$array输入作为最后一个参数。array_filter和array_reduce将$array输入作为第一个参数。作为对比,当您在JavaScript中调用数组上的映射、筛选或缩减时,回调函数签名如下所示
(current, index, array) => {…}Array.prototype.reduce将结转值作为第一个参数,但在JavaScript方法中仍然不可能混淆参数的顺序。
我知道PHP并不是面向功能的,但是我想知道是什么设计决定导致了array_map的签名等等。
array_map是否接受数组作为最后一个参数,仅仅是因为您可以输入任意数量的数组(变量)?通过array_map的回调函数向任意数量的数组提供数据的能力是否超过具有更一致的函数签名的能力?
编辑/评论:
从维基百科( Wikipedia )可以看出,PHP已经发展了多长时间:
早期的PHP并不打算成为一种新的编程语言,而是有机地发展起来,Lerdorf在回顾中指出:“我不知道如何阻止它,从来没有打算编写一个编程语言…我完全不知道如何编写编程语言,我只是在途中不断地添加下一个逻辑步骤。“一个开发团队开始组建,经过几个月的工作和测试,于1997年11月正式发布了PHP/FI 2。不是最初设计的,而是有机地开发的,这导致了函数的命名不一致,参数的排序也不一致。在某些情况下,函数名的选择是为了与PHP“包装”的低级库相匹配,而在一些早期版本中,函数名的长度被内部用作散列函数,因此选择名称来改进散列值的分布。
发布于 2016-06-02 23:02:01
array_map是否接受数组作为最后一个参数,仅仅是因为您可以输入任意数量的数组(变量)?
是的;只有方法签名中的最后一个参数可以是可变的。
通过array_map的回调函数向任意数量的数组提供数据的能力是否超过具有更一致的函数签名的能力?
本质上,这是在问array_map是否应该接受多个数组。这里有允许使用多个数组调用array_map的良好用例;下面是我稍微修改过的PHP指南中的一个示例:
<?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);
}https://stackoverflow.com/questions/37603034
复制相似问题