我有一个带有一些值(数值)的数组:
$arr1 = [1, 3, 8, 12, 23]
,我还有另一个关联数组,键(与$arr1
的值匹配)对应于一个值。此数组还可能包含与$arr1
不匹配的键。
$arr2 = [1 => "foo", 2 => "foo98", 3 => "foo20", 8 => "foo02", 12 => "foo39", 15 => "foo44", 23 => "foo91", 34 => "foo77"]
我想要返回$arr2
的值作为键,指定$arr1
的值作为键:
["foo", "foo20", "foo02", "foo39", "foo91"]
如果可能的话,使用PHP数组本机函数(以一种优雅的方式),或者至少使用最少的循环次数,所有这些都无需循环。
答案 0 :(得分:3)
最小循环很简单-1.如:
foreach($arr1 as $k) {
$res[] = $arr2[$k];
}
您可以使用array_walk
来做到这一点,但我认为这种简单的方法更具可读性。
如果您坚持要使用array_filter
+ array_values
+ in_array
,请执行以下操作:
$res = array_values(array_filter($arr2,
function ($key) use ($arr1) { return in_array($key, $arr1);},
ARRAY_FILTER_USE_KEY
));
有关过滤键的更多信息,您可以查看this
答案 1 :(得分:1)
要纯粹使用数组函数来完成此操作,可以按照以下步骤操作
print_r(array_intersect_key($arr2, array_flip($arr1) ));
因此,array_flip()
将要从数组中获得的项目转换为$arr1
的键,然后使用array_intersect_key()
将键与主数组和这个新创建的数组进行匹配。
给......
Array
(
[1] => foo
[3] => foo20
[8] => foo02
[12] => foo39
[23] => foo91
)
如果您不想要按键,请在其余的通话周围添加array_values()
...
print_r(array_values(array_intersect_key($arr2, array_flip($arr1) )));
获得
Array
(
[0] => foo
[1] => foo20
[2] => foo02
[3] => foo39
[4] => foo91
)
尽管已指出-有时简单的foreach()
一样好,有时更好。