Extraindo dados do JSON usando o PHP

Aqui está um teste jason feed

{"MEMBERS":[{"NAME":"Joe Bob","PET":["DOG"]}, {"NAME":"Jack Wu","PET":["CAT","DOG","FISH"]}, {"NAME":"Nancy Frank","PET":["FISH"]}]} 

O que eu estou tentando fazer é extrair dados se PET contiver CAT ou FISH ou ambos. Outro usuário sugeriu um filtro como tal:

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

Mas não está devolvendo nada.

Nota: editada com base nos comentários abaixo

Deve funcionar assim:

 foreach($JSONarray['MEMBERS'] as $p) { if (array_diff($p['PET'], $filter) != $p['PET']) { echo $p['NAME'].''; } } 
  • Lembre-se de sempre usar aspas quando estiver tentando acessar um elemento de uma matriz associativa. Sem citações, o PHP tenta interpretá-lo como uma constante (lançando um aviso de falha). Então, em vez de $a[index] do $a['index'] . Por favor, veja Por que $ foo [bar] está errado?

  • No seu código, $p['PET'] será uma série de nomes de animais de estimação, e não um nome de estimação. Testar com in_array() não será bem sucedido, porque tentará encontrar toda a matriz em $filter . No meu exemplo de código, eu usei array_diff() que encontrará a diferença entre os dois arrays, então eu comparo isso com a matriz original. Se eles combinarem, os animais de estimação $filter não foram encontrados.

  1. Use strings para acessar a matriz e não as constantes não inicializadas.

  2. $p['PET'] é uma matriz . Você precisa usar algum outro método para compará-lo com $filter , por exemplo, array_intersect :

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

DEMO

Primeiro, você precisa usar aspas em suas chaves de matriz:

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

Em segundo lugar, você não pode usar in_array, pois assume que “agulha” é a matriz (‘CAT’, ‘FISH’) e nenhum de seus valores. (A ordem dos parâmetros também foi o contrário)

Aqui está um método usando array_intersect :

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