Извлечение данных из JSON с использованием PHP - PullRequest
1 голос
/ 07 июня 2011

Вот тест Джейсон Фид

{"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 ]

2 голосов
/ 07 июня 2011
  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

1 голос
/ 07 июня 2011

Должно работать так:

foreach($JSONarray['MEMBERS'] as $p) {

    if (array_diff($p['PET'], $filter) != $p['PET']) {
        echo $p['NAME'].'</br>';
    }
}
  • Не забывайте всегда использовать кавычки , когда вы пытаетесь получить доступ к элементу ассоциативного массива. Без кавычек PHP пытается интерпретировать его как константу (выдает уведомление об ошибке). Так что вместо $a[index] делай $a['index']. Также смотрите Почему $ foo [bar] не так?

  • В вашем коде $p['PET'] будет массивом имен питомцев, а не одного имени питомца. Тестирование с in_array() не будет успешным, потому что оно попытается найти весь массив в $filter. В моем примере кода я использовал array_diff(), который найдет разницу между двумя массивами, а затем сравнил ее с исходным массивом. Если они совпадают, $filter домашние животные не были найдены.

0 голосов
/ 07 июня 2011

Во-первых, вам нужно использовать кавычки в ключах массива:

$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>' );
    }
}
...