如何在 PHP 中搜索 JSON 数组

Posted

技术标签:

【中文标题】如何在 PHP 中搜索 JSON 数组【英文标题】:How to search through a JSON Array in PHP 【发布时间】:2011-10-22 16:33:44 【问题描述】:

我有一个 JSON 数组


  "people":[
    
      "id": "8080",
      "content": "foo"
    ,
     
      "id": "8097",
      "content": "bar"
    
  ]

如何搜索 8097 并获取内容?

【问题讨论】:

可以创建一个循环遍历peope->id数组 代表了多少人?如果它足够小,那么下面介绍的搜索循环之一可以很好地工作。如果它非常大,您可能需要其他东西。 另外,条目是否总是按 id 递增的顺序排列?如果是这样,围绕它构建的算法可以产生比遍历每个条目更有效的东西。 【参考方案1】:

使用json_decode函数将JSON字符串转换为对象数组,然后遍历数组直到找到所需的对象:

$str = '
  "people":[
    
      "id": "8080",
      "content": "foo"
    ,
     
      "id": "8097",
      "content": "bar"
    
  ]
';

$json = json_decode($str);
foreach ($json->people as $item) 
    if ($item->id == "8097") 
        echo $item->content;
    

【讨论】:

我每次都完全忘记了->人的部分。完美运行。【参考方案2】:

json_decode() 它并像任何其他数组或 StdClass 对象一样对待

$arr = json_decode('
  "people":[
    
      "id": "8080",
      "content": "foo"
    ,
     
      "id": "8097",
      "content": "bar"
    
  ]
',true);

$results = array_filter($arr['people'], function($people) 
  return $people['id'] == 8097;
);


var_dump($results);

/* 
array(1) 
  [1]=>
  array(2) 
    ["id"]=>
    string(4) "8097"
    ["content"]=>
    string(3) "bar"
  

*/

【讨论】:

我认为您对 array_map 的参数有问题。 我使用了array_map而不是array_filter。现已修复。【参考方案3】:

如果您的“人”对象数量相当少,那么前面的答案将适用于您。鉴于您的示例具有 8000 范围内的 ID,我怀疑查看每个 ID 可能并不理想。因此,这是另一种方法,可以在找到合适的人之前检查更少的人(只要人按 ID 顺序排列):

//start with JSON stored as a string in $jsonStr variable
//  pull sorted array from JSON
$sortedArray = json_decode($jsonStr, true);
$target = 8097; //this can be changed to any other ID you need to find
$targetPerson = findContentByIndex($sortedArray, $target, 0, count($sortedArray));
if ($targetPerson == -1) //no match was found
    echo "No Match Found";


function findContentByIndex($sortedArray, $target, $low, $high) 
    //this is basically a binary search

    if ($high < low) return -1; //match not found
    $mid = $low + (($high-$low) / 2)
    if ($sortedArray[$mid]['id'] > $target) 
        //search the first half of the remaining objects
        return findContentByIndex($sortedArray, $target, $low, $mid - 1);
    else if ($sortedArray[$mid]['id'] < $target)
        //search the second half of the remaining objects
        return findContentByIndex($sortedArray, $target, $mid + 1, $high);
    else
        //match found! return it!
        return $sortedArray[$mid];

【讨论】:

php 中没有二进制搜索?有趣的。我认为十年来我不必编写二进制搜索代码。哦 - 我刚刚注意到,这个答案已有十年历史了。哈哈!谷歌,大失败。有一个array_search函数: echo array_search("red",$a);尽管在 OP 的 JSON 中,有无用的列“人”(它用于格式化,而不是内容,假设这是他们拥有的所有 JSON),这造成了复杂性。

以上是关于如何在 PHP 中搜索 JSON 数组的主要内容,如果未能解决你的问题,请参考以下文章

如何在mysql表中搜索json数组字段中的字段?

如何使用 Eloquent 在包含对象数组的 json 字段中进行搜索

如何在laravel的json数组列中找到字符串搜索的位置

如何在php中打印json文件数组中的数据

如何在 javascript 中访问多维 PHP 数组作为 json 编码的变体?

如何在 PHP 中获取 JSON 数组并打印其值?