【问题标题】:array_intersect() with dynamic length of arguments具有动态参数长度的 array_intersect()
【发布时间】:2017-09-28 09:20:06
【问题描述】:

我有一个数组数组,当脚本运行时,它们的元素数可能不同。

$strict = [
    [0] => ['one', 'two', 'three', 'four'],
    [1] => ['one', 'two', 'four', 'eight'],
    [2] => ['two', 'four', 'ten', 'twenty'],
 /* [x] => [. . .] */
];

$result = array_intersect($strict[0], $strict[1], $strict[2]);
print_r($result); //shows ['two', 'four'];

我想做这样的事情:

$result = array_intersect($strict);

我传入一个动态长度的数组数组,array_intersect 将遍历每个数组并只获取公共条目。

执行array_intersect($strict) 不起作用,因为该函数至少需要两个参数。

可能是这样的

array_intersect(function ($array) {
    $list = '';
    foreach ($array as $el) {
        $list .= $el.',';
    }

    $list = rtrim($list, ',');

    return eval($list);
});

虽然这个特定的方法仍然会抛出错误

警告:array_intersect():至少需要 2 个参数,1 给定

【问题讨论】:

  • 您是否要获取$strict[0] 中出现在$strict 中的任何其他元素中的所有元素的列表?
  • 如果您使用 Mark Ba​​ker 的解决方案并使用 splat 运算符,那么只要 $strict 中至少有一个数组数组,您就可以调用 array_intersect 而不会引发警告。

标签: php arrays dynamic


【解决方案1】:

你可以使用call_user_func_array:

使用参数数组调用回调

所以你的回调是array_intersect,你可以像这样传递你的数组:

$result = call_user_func_array('array_intersect', $strict);

【讨论】:

  • 它对我有用,而 3 个点不起作用(使用它代替 array_intersect(...$strict); 是一个更好的选择)。谢谢:)
【解决方案2】:

您也可以利用现代 PHP 的数组打包/解包功能 - 也称为可变参数,或所谓的“splat”(...) 运算符 - 以及:

$result = array_intersect(...$strict);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多