如何在 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 数组的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Eloquent 在包含对象数组的 json 字段中进行搜索