如何在 PHP 中使用带有 array_map(...) 的数组?

Posted

技术标签:

【中文标题】如何在 PHP 中使用带有 array_map(...) 的数组?【英文标题】:How to use an array of arrays with array_map(...) in PHP? [duplicate] 【发布时间】:2017-01-28 16:56:58 【问题描述】:

php 函数 array_map(...) 期望回调作为第一个参数(或 null 用于 creating an array of arrays)和可变数量的数组参数,例如:

$foo => array_map(null, $bar, $buz);

现在我有一个案例,我需要将可变数量的数组传递给array_map(...)。我无法对此进行硬编码,因为array_map(...) 输入的数组是动态生成的。

function performSomeLogicAndGetArgumentsForMyFunction() 
    ...
    return ['bar' => [...], 'buz' => [...]];

$foo = array_map(null, performSomeLogicAndGetArgumentsForMyFunction());

这种方式行不通,因为array_map(...) 需要可变数量的数组,而不是数组的数组

有解决办法吗? 如何保持调用的灵活性并将可变数量的参数传递给array_map(...)(它也适用于我无法操作的所有其他可变参数函数。)

【问题讨论】:

看看call_user_func_array() 谢谢你们!是的,当然,它只是一个数组,可以轻松解包/迭代。 对不起,我把问题表述错了。问题实际上在于“重新传递”参数,例如到array_map(...)。我刚刚编辑了问题。 我已经更正/完全重写了这个问题。 【参考方案1】:

万不得已,请使用eval

//build you array of array variable names with the dynamic content coming in.
$arrays = ['$foo', '$bar', '$baz'];

$str = implode(', ', $arrays);
eval("\$map = array_map(null, $str);");

print_r($map);

注意永远不要向 eval 发送未经处理的输入。

See it working

【讨论】:

这是经过测试的工作代码,它回答了将可变数量的未知数组传递给 array_map 函数的问题。如果您投反对票,请至少发表评论,解释原因。【参考方案2】:

您正在返回一个数组数组,并且您想要映射到这些数组的最里面。您可以为此使用argument unpacking:

function say($n, $m) 
    return "The number $n is called $m in Spanish";

function arrays() 
    return [
        [ 1, 2, 3 ],
        [ 'uno', 'dos', 'tres' ],
    ];

print_r(
    array_map('say', ...arrays())
);

See it online at 3v4l.org.

或者,您可以使用call_user_func_array 中提到的RFC 以可衡量的运行时成本:

print_r(
    call_user_func_array(
        'array_map',
        array_merge(array ('say'), arrays())
    )
);

See it online at 3v4l.org.

这些模式中的任何一个都可以实现常用方法的可变参数形式。例如,要模拟vsprintf,可以使用:

sprintf('%s %s', ...['Hello', 'World']);
call_user_func_array('sprintf', array_merge(['%s, %s'], ['Hello', 'World']));

【讨论】:

以上是关于如何在 PHP 中使用带有 array_map(...) 的数组?的主要内容,如果未能解决你的问题,请参考以下文章

php array_map与array_walk使用对比

PHP array_map 一个有趣的函数

如何在 PHP 中将单个附加参数传递给 array_map 回调?

如何根据PHP中有array_map的条件交换元素?

PHP:我可以在 array_map 函数中获取索引吗?

array_map() 函数