这是一个测试jason feed
{"MEMBERS":[{"NAME":"Joe Bob","PET":["DOG"]}, {"NAME":"Jack Wu","PET":["CAT","DOG","FISH"]}, {"NAME":"Nancy Frank","PET":["FISH"]}]}
如果PET包含CAT或FISH或两者,我尝试做的是提取数据。另一位用户建议使用过滤器:
$filter = array('CAT', 'FISH');
// curl gets the json data (this part works fine but is not shown for brevity)
$JSONarray=json_decode($JSONdata,true);
foreach($JSONarray['MEMBERS'] as $p) {
if (in_array($p['PET'], $filter)) {
echo $p['NAME'] . '</br>';
}
}
但它没有返回任何东西。
注意:根据以下评论进行编辑
答案 0 :(得分:2)
使用字符串访问数组而不是未初始化的常量。
$p['PET']
是一个数组。您必须使用其他一些方法将其与$filter
进行比较,例如array_intersect
:
foreach($JSONarray['MEMBERS'] as $p) {
$diff = array_intersect($filter, $p['PET']);
if (!empty($diff)) {
echo $p['NAME'].'</br>';
}
}
答案 1 :(得分:1)
它应该像这样工作:
foreach($JSONarray['MEMBERS'] as $p) {
if (array_diff($p['PET'], $filter) != $p['PET']) {
echo $p['NAME'].'</br>';
}
}
当您尝试访问关联数组的元素时,请记住始终使用引号。如果没有引号,PHP会尝试将其解释为常量(在失败时抛出通知)。因此,而不是$a[index]
做$a['index']
。另请参阅Why is $foo[bar] wrong?
在您的代码中,$p['PET']
将是一个宠物名称数组,而不是一个宠物名称。使用in_array()
进行测试不会成功,因为它会尝试在$filter
中找到整个数组。在我的代码示例中,我使用array_diff()
来查找两个数组之间的差异,然后将其与原始数组进行比较。如果匹配,则找不到$filter
个宠物。
答案 2 :(得分:0)
首先,您需要在数组键上使用引号:
$JSONarray['MEMBERS']
$p['PET']
$p['NAME']
其次,你不能使用in_array,因为它假定'needle'是 数组('CAT','FISH')而不是任何一个值。 (参数顺序也是另一种方式)
以下是使用array_intersect的方法:
foreach($JSONarray['MEMBERS'] as $p) {
$test = array_intersect($filter, $p['PET']);
if (count($test)>0) {
print( $p['NAME'].'</br>' );
}
}