从对象数组中提取所有ID

时间:2020-07-07 19:03:51

标签: php

在PHP 7.4中,我具有与objets的关联数组:

$array = [
    1 => Class {
        'id' => 1,
        'call' => true,
    },
    5 => Class {
        'id' => 5,
        'call' => false,
    },
    7 => Class {
        'id' => 7,
        'call' => true,
    },
]

如果call属性=== true,我想提取所有ID。

搜索后,我认为我应该使用array_map函数。

$ids = array_map(function($e) {
    if (true === $e->call) {
        return $e->id;
    }
}, $array);

// Return :

array(3) {
  [1]=> 1
  [5]=> NULL
  [7]=> 7
}

但是我有两个问题:

  1. 我不希望有NULL个结果
  2. 我不希望在新的array中加入关联密钥。我想要一个新数组([0=>1, 1=>7]

我知道我可以使用foreach()来做到这一点,但是我发现使用单个PHP函数(array_walkarray_map吗?)很有趣

3 个答案:

答案 0 :(得分:1)

您可能希望array_filter过滤掉不需要的内容,然后可以提取id

$ids = array_column(array_filter($array, function($e) {
                                             return $e->call === true;
                                         }), 'id');

答案 1 :(得分:1)

创建一个数组,该数组是由call索引的id值,然后对其进行过滤。由于id是索引,因此请提取id的密钥...

$ids = array_keys(array_filter(array_column($array, "call", "id")));

print_r($ids));

Array
(
    [0] => 1
    [1] => 7
)

尽管我认为foreach()是更直接的方法。

答案 2 :(得分:0)

您可以reduce使用带有回调的数组,该回调有条件地将每个项目的ID添加到“携带”数组中。

$ids = array_reduce($array, fn($c, $i) => $i->call ? [...$c, $i->id] : $c, []);