使用PHP从JSON中提取数据

时间:2011-06-07 15:57:38

标签: php arrays json

这是一个测试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>';
        }
}

但它没有返回任何东西。

注意:根据以下评论进行编辑

3 个答案:

答案 0 :(得分:2)

  1. 使用字符串访问数组而不是未初始化的常量。

  2. $p['PET']是一个数组。您必须使用其他一些方法将其与$filter进行比较,例如array_intersect

    foreach($JSONarray['MEMBERS'] as $p) {
        $diff = array_intersect($filter, $p['PET']);
        if (!empty($diff)) {
            echo $p['NAME'].'</br>';
        }
    }
    
  3. DEMO

答案 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>' );
    }
}