通过值搜索关联数组

39
我正在从Flickr的API获取一些JSON数据。我的问题是,根据相机不同,exif数据的顺序也不同。因此,我不能硬编码数组编号来获取例如下面的相机型号。PHP是否有任何内置方法可以搜索关联数组的值并返回匹配的数组?在我的下面的示例中,我想搜索并获取<_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
                )

        )

@Jogan,你能帮我解决这个问题吗?https://stackoverflow.com/questions/44721195/php-how-do-i-apply-multiple-filtering-conditions-passed-as-an-array-of-arrays? - Valay
8个回答

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

在较新的PHP版本中,特别是PHP 5 >= 5.5.0,上述函数将会起作用。


1
我认为这个答案是最有效的解决方案。 - Behzadsh

23
据我所知,没有这样的函数。有一个名为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
感谢您提供通用的解决方案 :-) - Johan
1
然而,我认为in应该改为as。并且then应该被移除? - Johan
5
@Johan. 的确,当使用多种编程语言时,有时会混淆它们。 :) - GolezTrol

17

$key = array_search('Model', array_map(function($data) {return $data['label'];}, $exif))

array_map()函数会将数组中的每个值传递给用户自定义的函数,并返回新的由用户自定义函数指定的值的数组。在这里,我们返回的是标签(label)。

array_search()函数用于在数组中搜索指定的值,并返回对应的键。在这里,我们在通过array_map返回的数组中搜索标签(label)值为'Model'的元素,并返回其对应的键。


3
我非常喜欢这种方法,比其他列出的方法更好!它是真正的 PHP,而且个人认为比传统的 foreach 方法快得多。有人可以进行基准测试! - Marais Rossouw
1
array_search + array_map与循环相比的性能有证据吗? - userlond
3
你能否在你的代码中添加一些解释,以便其他人可以从中学习? - Nico Haase
我已经添加了一些解释 @NicoHasse - moldypenguins
虽然 @AriefHidayatulloh 的答案可能更好?array_column() 函数返回输入数组中单个列中的值。 - moldypenguins

5
这很容易实现:
$model = '';

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

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

最好不要使用foreach循环。 - rameezmeans

1
以下函数在关联数组中搜索字符串值和其他数组内的值。例如,给定以下数组:
 $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;
     }

1
$data = [
["name"=>"mostafa","email"=>"mostafa@gmail.com"],
["name"=>"ali","email"=>"ali@gmail.com"],
["name"=>"nader","email"=>"nader@gmail.com"]];

chekFromItem($data,"ali");

function chekFromItem($items,$keyToSearch)
{
$check = false;
foreach($items as $item)
{
    foreach($item as $key)
    {
        if($key == $keyToSearch)
        {
            $check = true;
        }
    }

    if($check == true)
    {break;}
}
return $check;}

0
据我所知,PHP没有针对多维数组的内置搜索函数。它只为索引和关联数组提供了搜索功能。因此,您必须编写自己的搜索函数!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接