multidimensional - php array search key
buscar matriz asociativa por valor (7)
Estoy recuperando algunos JSON de la API de flickrs. Mi problema es que los datos exif están en diferente orden dependiendo de la cámara. Por lo tanto, no puedo codificar un número de matriz para obtener, por ejemplo, el modelo de cámara a continuación. ¿Tiene PHP algún método integrado para buscar valores de matrices asociativas y devolver las matrices coincidentes? En mi ejemplo a continuación, me gustaría buscar la [label] => Model
y obtener [_content] => NIKON D5100
.
Por favor déjame saber si quieres que te explique.
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
)
)
Esto sería bastante trivial de implementar:
$model = '''';
foreach ($exif[''photo''][''exif''] as $data) {
if ($data[''label''] == ''Model'') {
$model = $data[''raw''][''_content''];
break;
}
}
La siguiente función busca en una matriz asociativa tanto valores de cadena como valores dentro de otras matrices. Por ejemplo, dada la siguiente matriz
$array= [ "one" => ["a","b"],
"two" => "c" ];
La siguiente función puede encontrar tanto a, byc como
function search_assoc($value, $array){
$result = false;
foreach ( $array as $el){
if (!is_array($el)){
$result = $result||($el==$value);
}
else if (in_array($value,$el))
$result= $result||true;
else $result= $result||false;
}
return $result;
}
Que yo sepa, PHP no tiene una función de búsqueda integrada para una matriz multidimensional. Solo tiene para matriz indexada y asociativa. Por lo tanto, tienes que escribir tu propia función de búsqueda!
Que yo sepa, no hay tal función. Hay array_search , pero no hace exactamente lo que quieres.
Creo que la forma más fácil sería escribir un bucle a ti 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'');
array_search (''Model'', array_map (function ($ data) {return $ data [''label''];}, $ exif))
foreach($exif[''photo''][''exif''] as $row) {
foreach ($row as $k => $v) {
if ($k == "label" AND $v == "Model")
$needle[] = $row["raw"];
}
}
print_r($needle);
$key = array_search(''model'', array_column($data, ''label''));
En versiones más recientes de PHP, específicamente PHP 5> = 5.5.0, la función anterior funcionará.