【问题标题】:search some object data in array [duplicate]在数组中搜索一些对象数据[重复]
【发布时间】:2020-03-20 11:17:01
【问题描述】:

我有一个这样的数组:

$array = (
[0] => stdClass Object
    (
        [ID] => 420
        [name] => Mary
     )

[1] => stdClass Object
    (
        [ID] => 10957
        [name] => Blah
     )
)
...

我找到了一些使用循环搜索的解决方案,如下所示:

$item = null;
    foreach($array as $struct) {
    if ($v == $struct->ID) {
        $item = $struct;
        break;
    }
}

由于数据量大,想改一下,这样就可以一次检索多个值而不是一个值(例如:$array->420 = Mary, $array->10957 = Blah ,...)。在这种情况下,哪种方式最理想?

【问题讨论】:

  • 在一个新数组中收集这些值。
  • 如果你的ID是唯一的,那么我会用它们替换原始数组的键,这样你就可以直接访问$array[420],或者使用isset查看特定键是否是设置,当您需要查找具有特定 ID 的元素是否存在时。 array_combine 和 array_column 的组合有助于相应地修改数组。
  • 看起来类似于:stackoverflow.com/q/4742903/2943403(署名很好)
  • 您的对象是否只有 ID 和名称?或者你那里有更多你需要的东西(你在这个问题中省略了)?
  • 看起来你想要这个的倒数:stackoverflow.com/q/25994438/2943403

标签: php


【解决方案1】:

如果您按 ID 索引您的主数组(为此使用 array_column()),以及您所追求的 ID 数组,那么 array_intersect_key() 会将您想要的所有内容提取到匹配列表中。 ..

$array =[
    (Object)
    [
        "ID" => 420,
        "name" => "Mary"
        ],

    (Object)
    [
        "ID" => 10957,
        "name" => "Blah"
    ]
];

$ids = [420, 10957];

$indexArray = array_column($array, null, "ID" );
$matches = array_intersect_key($indexArray, array_flip($ids));
print_r($matches);

给..

(
    [420] => stdClass Object
        (
            [ID] => 420
            [name] => Mary
        )

    [10957] => stdClass Object
        (
            [ID] => 10957
            [name] => Blah
        )

)

您需要在 ID 的数组上使用 array_flip() 将值转换为键以使用 array_intersect_key() 函数。

如果您不想要此数据的密钥(即 ID),则可以使用 array_values()

【讨论】:

  • "在这种情况下哪种方式是最佳的?" 作为记录,这会在输入上进行两次传递,这将比单个 foreach 循环效率低.代码简洁是这个 sn-p 的好处。
  • @mickmackusa 我需要获取多个值,并且我不想为每个值循环整个数组。
【解决方案2】:

根据您的需要,这里有三种可能的解决方案,使用array_column

构建一个 ID => 名称数组:

$result = array_column($array, 'name', 'ID');

构建一个 ID => 条目数组(如果你有更多的东西,而不仅仅是名称):

$result = array_column($items, null, 'ID');

替代使用array_reduce:

$result = array_reduce($array, static function ($result, $item) {
  $result[$item['ID']] = $item;
  return $result;
});

演示:https://3v4l.org/fLMgL

【讨论】:

  • 每次看到array_combine(array_column($array, 'ID'), $array);,我总是不同意。从 Nigel 的 array_column() 调用中学习。
  • @mickmackusa 没错,我似乎总是忘记函数的使用(这很方便,但对我来说很不直观)。相应地编辑了我的帖子。
猜你喜欢
  • 2015-05-18
  • 1970-01-01
  • 2018-03-25
  • 2013-09-08
  • 2013-12-18
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多