首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP通过嵌套键查找数组项

PHP通过嵌套键查找数组项
EN

Stack Overflow用户
提问于 2022-04-29 13:52:18
回答 2查看 71关注 0票数 0

我有一个PHP数组,我需要基于tlp_queue_manager_schedulers对象中的一个键找到一个项,我尝试执行array_search,但是这返回了false,我还尝试将这个方法与array_column组合

代码语言:javascript
复制
[
   {
      "tlp_queue_manager_schedulers":{
         "id":"1",
         "token":"ABC"
      },
      "0":{
         "num":"1"
      }
   },
   {
      "tlp_queue_manager_schedulers":{
         "id":"3",
         "token":"cron-3"
      },
      "0":{
         "num":"2"
      }
   },
   {
      "tlp_queue_manager_schedulers":{
         "id":"4",
         "token":"CronA75nvAgjsm8b"
      },
      "0":{
         "num":"3"
      }
   },
   {
      "tlp_queue_manager_schedulers":{
         "id":"2",
         "token":"XYZ"
      },
      "0":{
         "num":"4"
      }
   }
]

例如,我需要返回id键与3匹配的数组项,然后返回:

代码语言:javascript
复制
{
    "tlp_queue_manager_schedulers":{
         "id":"3",
         "token":"cron-3"
    },
    "0":{
         "num":"2"
    }
}
EN

回答 2

Stack Overflow用户

发布于 2022-04-29 16:05:50

foreach循环很好。没有什么比foreach循环更好了:

代码语言:javascript
复制
$matchingObject = null;

foreach($array as $obj)
{
    if($obj->tlp_queue_manager_schedulers->id == "3")
    {
        $matchingObject = $obj;
        break;
    }
}
票数 2
EN

Stack Overflow用户

发布于 2022-04-30 08:23:30

虽然@Quasipickle的foreach循环也是我的主要修复方法,但由于我们有一个“简短的挑战”与Javascript的array.find()方法相比,这里有一个带有array_filter的PHP liner

代码语言:javascript
复制
$matches = array_filter($data, 
    fn($row) => $row['tlp_queue_manager_schedulers']['id'] == '3'
);

给出样本数据后,返回:

代码语言:javascript
复制
array(1) {
    [1] · array(2) {
        ["tlp_queue_manager_schedulers"] · array(2) {
            ["id"] · string(1) "3"
            ["token"] · string(6) "cron-3"
        }
        [0] · array(1) {
            ["num"] · string(1) "2"
        }
    }
}

请注意,这将返回一个数组,其所有项都与条件匹配(保留原始索引)。如果没有找到匹配项,则返回一个空数组。如果您只对第一次匹配感兴趣,那么$match = current($matches); (没有匹配:false)或$match = array_shift($matches); (没有匹配:null)会给出这个结果。

如果您有一个很大的数据集,并且只关心查找第一个匹配项,那么在匹配后找到带有breakbreak(或者如果您的循环在助手函数中,则可以选择return ),可能会节省大量冗余周期,因为array_filter将检查整个数组直到结束(对于小型数据集来说,这种差异将是无关紧要的)。

如果您想知道为什么array_search不能工作:它只查看数组值,则不能指定要检查的键。即使您第一次使用array_column,您的列仍然是一个关联数组。您可以通过这些功能和某种程度的欺骗来完成这一任务,但是这将是一个冗长而复杂的解决方案。最好保持简单干净。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72059054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档