【问题标题】:Extracting Data from JSON Using PHP使用 PHP 从 JSON 中提取数据
【发布时间】:2011-06-07 15:57:38
【问题描述】:

这是一个测试 jason 提要

{"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>';
        }
}

但它没有返回任何东西。

注:根据以下cmets编辑

【问题讨论】:

  • $JSONarray[MEMBERS] 需要在 MEMBERS 周围加上引号。 PETNAME 也有同样的问题(拼写错误)。
  • 抱歉,在 NAMR 上面的错字是 NAME
  • 有什么错误吗?该代码看起来充满了它们......
  • 总是使用error_reporting(E_ALL);当你编码时,你会在你的代码中看到“使用未定义的常量成员”等提示

标签: php arrays json


【解决方案1】:
  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>';
        }
    }
    

DEMO

【讨论】:

  • 这给出了“不能在写上下文中使用函数返回值”
  • 是的,现在可以了。什么更健壮? array_intersect 或 array_diff
  • @John:两者都很健壮。但我会说测试一个数组是否为空比将它与另一个数组进行比较要快。不过,@bazmegakapa 对您的问题给出了更好的解释:)
【解决方案2】:

它应该像这样工作:

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 宠物。

【讨论】:

    【解决方案3】:

    首先,您需要在数组键上使用引号:

    $JSONarray['MEMBERS']
    $p['PET']
    $p['NAME']
    

    其次,您不能使用 in_array,因为它假定 'needle' 是 the array('CAT', 'FISH') 而不是它的任何值。 (参数顺序也是反过来的)

    这是一个使用array_intersect的方法:

    foreach($JSONarray['MEMBERS'] as $p) {
        $test = array_intersect($filter, $p['PET']);
        if (count($test)>0) {
            print( $p['NAME'].'</br>' );
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-19
      • 2011-07-28
      • 2021-10-10
      相关资源
      最近更新 更多