2012-09-11 21 views
16

Estoy obteniendo algunos JSON de Flickrs API. Mi problema es que los datos exif están en orden diferente según la cámara. Así que no puedo codificar un número de matriz para obtener, por ejemplo, el modelo de cámara a continuación. ¿PHP tiene algún método integrado para buscar a través de valores de matriz asociativa y devolver las matrices coincidentes? En mi ejemplo a continuación, me gustaría buscar el [label] => Model y obtener [_content] => NIKON D5100.buscar matriz asociativa por valor

Háganme saber si quiere que lo aclare.

print_r($exif['photo']['exif']); 

Resultado:

Array 
(
    [0] => Array 
     (
      [tagspace] => IFD0 
      [tagspaceid] => 0 
      [tag] => Make 
      [label] => Make 
      [raw] => Array 
       (
        [_content] => NIKON CORPORATION 
       ) 

     ) 

    [1] => Array 
     (
      [tagspace] => IFD0 
      [tagspaceid] => 0 
      [tag] => Model 
      [label] => Model 
      [raw] => Array 
       (
        [_content] => NIKON D5100 
       ) 

     ) 

    [2] => Array 
     (
      [tagspace] => IFD0 
      [tagspaceid] => 0 
      [tag] => XResolution 
      [label] => X-Resolution 
      [raw] => Array 
       (
        [_content] => 240 
       ) 

      [clean] => Array 
       (
        [_content] => 240 dpi 
       ) 

     ) 
+0

@Jogan podría ayudarme con esto https://stackoverflow.com/questions/44721195/php-how-do-i-apply-multiple-filtering-conditions-passed-as-an-array-of -¿Maarrays? – Valay

Respuesta

15

Que yo sepa, no existe tal función. Hay array_search, pero no hace exactamente lo que quiere.

Creo que la manera más fácil sería escribir un bucle usted mismo.

function search_exif($exif, $field) 
{ 
    foreach ($exif as $data) 
    { 
     if ($data['label'] == $field) 
      return $data['raw']['_content']; 
    } 
} 

$camera = search_exif($exif['photo']['exif'], 'model'); 
+2

Gracias por la solución genérica :-) – Johan

+1

Sin embargo, creo que 'in' debe ser' as'. Y 'entonces' debería ser eliminado? – Johan

+2

@Johan. De hecho, cuando usa múltiples lenguajes de programación, a veces los mezcla. :) – GolezTrol

4

Esto sería bastante trivial de implementar:

$model = ''; 

foreach ($exif['photo']['exif'] as $data) { 
    if ($data['label'] == 'Model') { 
     $model = $data['raw']['_content']; 
     break; 
    } 
} 
+0

¡Gracias, justo lo que necesitaba! – Johan

2
foreach($exif['photo']['exif'] as $row) { 
    foreach ($row as $k => $v) { 
     if ($k == "label" AND $v == "Model") 
      $needle[] = $row["raw"]; 
    } 
} 
print_r($needle); 
+0

edite su código: debe ser '$ needle [] = $ row ['raw']' – diEcho

0

Por lo que sé, PHP no tiene una función de búsqueda incorporada para una matriz multidimensional. Tiene solo para matriz indexada y asociativa. Por lo tanto, debes escribir tu propia función de búsqueda.

12

array_search ('Modelo', array_map (function ($ data) {return $ data [ 'etiqueta'];}, $ Exif))

+1

¡Me gusta este método mucho mejor que el resto aquí enumerado! Es verdadero PHP, y personalmente mucho más rápido que el método foreach tradicional. ¡Alguien lo compara! –

+0

¿Hay alguna prueba sobre el rendimiento de 'array_search' +' array_map' vs loop? – userlond

18
$key = array_search('model', array_column($data, 'label')); 

En PHP más reciente, la función anterior funcionará.

+0

Creo que esta respuesta es la solución más eficiente. – Behzadsh

Cuestiones relacionadas