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.
Use strings para acessar a matriz e não as constantes não inicializadas.
$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'].'' ); } }