PHP重新创建数组(如果包含某些值)

时间:2019-07-14 18:00:07

标签: php arrays

我有$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版本中是否有更短,更好的方法来完成此任务。

4 个答案:

答案 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));

演示:https://3v4l.org/4UC41

答案 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);

https://3v4l.org/jQo6E

答案 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;
    }
}

Php demo

答案 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',
  ),
)