Поиск ассоциативного массива по значению - программирование
Подтвердить что ты не робот

Поиск ассоциативного массива по значению

Я извлекаю 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
                )

        )
4b9b3361

Ответ 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 не имеет встроенной функции поиска для многомерного массива. Он имеет только для индексированного и ассоциативного массива. Поэтому вам нужно написать свою собственную функцию поиска.