当前位置: 首页 > 面试题库 >

PHP:如何使用array_filter()筛选数组键?

符俊材
2023-03-14
问题内容

回调函数array_filter()仅传递数组的值,而不传递键。

如果我有:

$my_array = array("foo" => 1, "hello" => "world");

$allowed = array("foo", "bar");

删除数组中所有$my_array不在其中的键的最佳方法是$allowed什么?

所需的输出:

$my_array = array("foo" => 1);

问题答案:

PHP
5.6引入了第三个参数array_filter()flag,你可以设置为ARRAY_FILTER_USE_KEY通过键,而不是值进行筛选:

$my_array = ['foo' => 1, 'hello' => 'world'];
$allowed  = ['foo', 'bar'];
$filtered = array_filter(
    $my_array,
    function ($key) use ($allowed) {
        return in_array($key, $allowed);
    },
    ARRAY_FILTER_USE_KEY
);

显然,这不如优雅array_intersect_key($my_array, array_flip($allowed)),但是它确实提供了额外的灵活性,$allowed可以对键执行任意测试,例如可以包含正则表达式模式而不是纯字符串。

您还可以ARRAY_FILTER_USE_BOTH将值和键都传递给过滤器函数。这是一个基于第一个示例的示例,但请注意,我不建议您使用$allowed这种方式编码过滤规则:

$my_array = ['foo' => 1, 'bar' => 'baz', 'hello' => 'wld'];
$allowed  = ['foo' => true, 'bar' => true, 'hello' => 'world'];
$filtered = array_filter(
    $my_array,
    function ($val, $key) use ($allowed) { // N.b. $val, $key not $key, $val
        return isset($allowed[$key]) && (
            $allowed[$key] === true || $allowed[$key] === $val
        );
    },
    ARRAY_FILTER_USE_BOTH
); // ['foo' => 1, 'bar' => 'baz']


 类似资料:
  • 问题内容: 给定以下数组 当我运行时,由于它不是递归的,所以会得到结果。 也不会这样做,因为我实际上需要递归运行,然后计算其结果。 所以我的问题是:在这种情况下如何递归运行?我的预期结果是。 请注意,我没有使用任何回调,因此可以排除false,null和empty。 问题答案: 应该管用 或许 肯定还有更多可能的解决方案。如果你想使用(没有回调)记住,它把为过,因此它会 删除 任何从数组-值。 如

  • 问题内容: 我有以下代码: 我可以用来过滤这样的数组: 我如何在lower_than_10中添加参数,以便它也接受要检查的数字?喜欢,如果我有这个: 如何从array_filter调用它传递10到$ num或任何数字? 问题答案: 作为@Charles使用闭包的解决方案]的替代方法,您实际上可以在文档页面的注释中找到示例。 这个想法是您创建一个具有所需状态()和回调方法(作为参数)的对象: 用法(

  • 问题 你想要根据布尔条件来筛选数组。 解决方案 使用 Array.filter (ECMAScript 5): array = [1..10] array.filter (x) -> x > 5 # => [6,7,8,9,10] 在 EC5 之前的实现中,可以通过添加一个筛选函数扩展 Array 的原型,该函数接受一个回调并对自身进行过滤,将回调函数返回 true 的元素收集起来。 # 扩展 A

  • 我有一个返回字符串[][]的方法,如下所示: 我做错了什么?

  • 我希望筛选Pandas Dataframe以从两种不同类型的属性中选择数据: 但是我不能使用这个选项,或者为此,你能给我一个如何做的例子吗。

  • 我正在为一个数组做一个搜索函数。我有一个输入[文本],例如,我把'ban',然后我需要所有以'ban'开头的结果显示出来,例如香蕉,香蕉奶昔,香蕉(油炸),等等。 我该怎么做呢?我试过了,但每次都不准确。我试过的在下面。 我有一个非常接近,但当我键入“ban”时,它出现了“aardbei”。这显然是错误的。在这里,也许我忽略了什么?