为了账号安全,请及时绑定邮箱和手机立即绑定

PHP:如何使用Array_filter()来过滤数组键?

PHP:如何使用Array_filter()来过滤数组键?

PHP
拉丁的传说 2019-07-26 15:18:04
PHP:如何使用Array_filter()来过滤数组键?中的回调函数array_filter()只传递数组的值,而不是键。如果我有:$my_array = array("foo" => 1, "hello" => "world");$allowed = array("foo", "bar");删除所有键的最佳方法是什么$my_array不在$allowed阵列?期望产出:$my_array = array("foo" => 1);
查看完整描述

3 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

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可以包含regex模式而不是普通字符串。

您也可以使用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']




查看完整回答
反对 回复 2019-07-27
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

带着array_intersect_keyarray_flip:

var_dump(array_intersect_key($my_array, array_flip($allowed)));array(1) {
  ["foo"]=>
  int(1)}


查看完整回答
反对 回复 2019-07-27
?
慕神8447489

TA贡献1780条经验 获得超1个赞

我需要做同样的事,但有一个更复杂的array_filter在钥匙上。

这是我是如何做到的,使用了类似的方法。

// Filter out array elements with keys shorter than 4 characters$a = array(
  0      => "val 0", 
  "one"  => "val one", 
  "two"  => "val two", 
  "three"=> "val three", 
  "four" => "val four", 
  "five" => "val five", 
  "6"    => "val 6"); $f = array_filter(array_keys($a), function ($k){ return strlen($k)>=4; }); $b = array_intersect_key($a, array_flip($f));print_r($b);

这将输出结果:

Array(
    [three] => val three    [four] => val four    [five] => val five)



查看完整回答
反对 回复 2019-07-27
  • 3 回答
  • 0 关注
  • 1087 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信