【问题标题】:search associative array by value按值搜索关联数组
【发布时间】:2012-09-04 19:31:07
【问题描述】:

我正在从 flickrs API 获取一些 JSON。我的问题是 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
                )

        )

【问题讨论】:

标签: php


【解决方案1】:
$key = array_search('model', array_column($data, 'label'));

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

【讨论】:

  • 我认为这个答案是最有效的解决方案。
【解决方案2】:

据我所知,没有这样的功能。有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');

【讨论】:

  • 感谢通用解决方案 :-)
  • 但是,我认为in 应该是as。并且then 应该被删除?
  • @Johan。事实上,当使用多种编程语言时,有时会混淆它们。 :)
【解决方案3】:

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

array_map() 函数将数组的每个值发送到用户创建的函数,并返回一个由用户创建的函数给出的具有新值的数组。在这种情况下,我们将返回标签。

array_search() 函数在数组中搜索值并返回键。 (在这种情况下,我们正在从 array_map 返回的数组中搜索标签值“Model”)

【讨论】:

  • 我比这里列出的其他方法更喜欢这种方法!它是真正的 PHP,而且个人比传统的 foreach 方法快很多。有人对此进行基准测试!
  • array_search + array_map vs loop 的性能有什么证据吗?
  • 您能否在您的代码中添加一些解释,以便其他人可以从中学习?
  • 我已经添加了一些解释@NicoHasse
  • 虽然@AriefHidayatulloh 的回答可能会更好? array_column() 函数返回输入数组中单列的值。
【解决方案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);

【讨论】:

  • 最好不要使用 foreach 循环。
【解决方案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】:
    $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;}
    

    【讨论】:

      【解决方案8】:

      据我所知,PHP 没有内置的多维数组搜索功能。它仅适用于索引和关联数组。因此,您必须编写自己的搜索功能!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-18
        • 1970-01-01
        • 2016-02-07
        • 2014-08-12
        • 2019-03-11
        • 2020-09-22
        相关资源
        最近更新 更多