Поиск ассоциативного массива по значению
Я извлекаю JSON из API flickrs. Моя проблема в том, что данные exif находятся в другом порядке в зависимости от камеры. Поэтому я не могу жестко закодировать номер массива, например, модель камеры. Есть ли у PHP какие-либо встроенные методы для поиска по значениям ассоциативного массива и возврата соответствующих массивов? В моем примере ниже я хотел бы найти [label] => Model
и получить [_content] => NIKON D5100
.
Пожалуйста, дайте мне знать, если вы хотите, чтобы я уточнил.
print_r($exif['photo']['exif']);
Результат:
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
)
)
Ответы
Ответ 1
Насколько мне известно, такой функции нет. Существует array_search, но он не совсем делает то, что вы хотите.
Я думаю, что самым простым способом было бы написать цикл самостоятельно.
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
$key = array_search('model', array_column($data, 'label'));
В более поздних версиях PHP, в частности PHP 5> = 5.5.0, функция выше будет работать.
Ответ 3
$key = array_search('Model', array_map(function($data) {return $data['label'];}, $exif))
Функция array_map() отправляет каждое значение массива в пользовательскую функцию и возвращает массив с новыми значениями, данными пользовательской функцией. В этом случае мы возвращаем метку.
Функция array_search() ищет в массиве значение и возвращает ключ. (в этом случае мы ищем возвращенный массив из array_map для значения метки 'Model')
Ответ 4
Это было бы довольно тривиально реализовать:
$model = '';
foreach ($exif['photo']['exif'] as $data) {
if ($data['label'] == 'Model') {
$model = $data['raw']['_content'];
break;
}
}
Ответ 5
foreach($exif['photo']['exif'] as $row) {
foreach ($row as $k => $v) {
if ($k == "label" AND $v == "Model")
$needle[] = $row["raw"];
}
}
print_r($needle);
Ответ 6
Следующая функция ищет в ассоциативном массиве как строковые значения, так и значения внутри других массивов. Например, учитывая следующий массив
$array= [ "one" => ["a","b"],
"two" => "c" ];
следующая функция может также найти и a, b и c
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;
}
Ответ 7
Насколько я знаю, PHP не имеет встроенной функции поиска для многомерного массива. Он имеет только для индексированного и ассоциативного массива. Поэтому вам нужно написать свою собственную функцию поиска.