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

如果我有:

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

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

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

所需的输出:

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

#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

)

#2楼

这是使用unset()的不太灵活的选择:

$array = array(

1 => 'one',

2 => 'two',

3 => 'three'

);

$disallowed = array(1,3);

foreach($disallowed as $key){

unset($array[$key]);

}

print_r($array)的结果是:

Array

(

[2] => two

)

如果您想保留过滤后的值以备后用,则此方法不适用,但如果您确定不使用,则此方法不适用。

#3楼

这是使用闭包的更灵活的解决方案:

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

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

$result = array_flip(array_filter(array_flip($my_array), function ($key) use ($allowed)

{

return in_array($key, $allowed);

}));

var_dump($result);

输出:

array(1) {

'foo' =>

int(1)

}

因此,在功能中,您可以执行其他特定的测试。

#4楼

如果您正在寻找一种通过键中出现的字符串过滤数组的方法,则可以使用:

$mArray=array('foo'=>'bar','foo2'=>'bar2','fooToo'=>'bar3','baz'=>'nope');

$mSearch='foo';

$allowed=array_filter(

array_keys($mArray),

function($key) use ($mSearch){

return stristr($key,$mSearch);

});

$mResult=array_intersect_key($mArray,array_flip($allowed));

print_r($mResult)是

Array ( [foo] => bar [foo2] => bar2 [fooToo] => bar3 )

支持正则表达式的此答案的改编

function array_preg_filter_keys($arr, $regexp) {

$keys = array_keys($arr);

$match = array_filter($keys, function($k) use($regexp) {

return preg_match($regexp, $k) === 1;

});

return array_intersect_key($arr, array_flip($match));

}

$mArray = array('foo'=>'yes', 'foo2'=>'yes', 'FooToo'=>'yes', 'baz'=>'nope');

print_r(array_preg_filter_keys($mArray, "/^foo/i"));

输出量

Array

(

[foo] => yes

[foo2] => yes

[FooToo] => yes

)

#5楼

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

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐