我有$fruits_arr
:
Array
(
[0] => Array
(
[id] => 213
[fruit] => banana
)
[1] => Array
(
[id] => 438
[fruit] => apple
)
[2] => Array
(
[id] => 154
[fruit] => peach
)
)
还有$ids_arr
:
Array (
[0] => 213
[1] => 154
)
我想重新创建$fruits_arr
,使其仅包含id
等于$ids_arr
中的值的数组项。我还想保持$fruits_arr
的索引/数组顺序。
我正在使用以下内容:
$selected_fruits = array();
foreach( $fruits_arr as $fruit ) :
if ( in_array( $fruit['id'], $ids_arr ) ) :
$selected_fruits[] = $fruit;
endif;
endforeach;
print_r( $selected_fruits );
这似乎可行,但是我想知道在最新的PHP版本中是否有更短,更好的方法来完成此任务。
答案 0 :(得分:2)
您可以使用array_filter使其更简洁,但这不会太多,并且可能会使代码的可读性降低。如果可能,请在代码长度上选择可读性。
$selected_fruits = array_filter($fruits_arr, function ($el) use ($ids_arr) {
return in_array($el['id'], $ids_arr, true);
});
或者您可以等待PHP 7.4(由于将于今年年底发布)并使用箭头功能。
$selected_fruits = array_filter($fruits_arr, fn ($el) => in_array($el['id'], $ids_arr, true));
答案 1 :(得分:1)
如果数组是关联数组(为此使用array_column),则可以使用array_intersect_key来完成这项工作。
$fruits_arr = array_column($fruits_arr, Null, "id");
$result = array_intersect_key($fruits_arr, array_flip($ids_arr));
var_dump($result);
答案 2 :(得分:0)
这不是更新或更短的方法,但是您可以使用array_flip然后使用isset来检查密钥:
$ids_arr = array_flip($ids_arr);
$selected_fruits = [];
foreach ($fruits_arr as $k => $fruit) {
if (isset($ids_arr[$fruit["id"]])) {
$selected_fruits[$k] = $fruit;
}
}
答案 3 :(得分:0)
保持简单,这是一个循环,其中删除了不在keep数组中的项。
<?php
$fruits =
[
'foo' => [
'id' => 1,
'fruit' => 'banana'
],
'bar' => [
'id' => 2,
'fruit' => 'orange'
],
'baz' => [
'id' => 3,
'fruit' => 'pear'
],
];
$keep_ids = [1,3];
foreach($fruits as $k=>$v)
if(!in_array($v['id'], $keep_ids))
unset($fruits[$k]);
var_export($fruits);
输出:
array (
'foo' =>
array (
'id' => 1,
'fruit' => 'banana',
),
'baz' =>
array (
'id' => 3,
'fruit' => 'pear',
),
)