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

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

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

如果我有:

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

删除所有键的最佳方法是什么$my_array不在$allowed阵列?

期望产出:

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


拉丁的传说
浏览 1088回答 3
3回答

慕容森

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']

缥缈止盈

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

慕神8447489

我需要做同样的事,但有一个更复杂的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)
打开App,查看更多内容
随时随地看视频慕课网APP