【问题标题】:Return true/false on searching multidimensional array搜索多维数组时返回真/假
【发布时间】:2011-05-05 09:49:39
【问题描述】:

我有以下多维$array:

Array
(
    [0] => Array
        (
            [domain] => example.tld
            [type] => 2
        )

    [1] => Array
        (
            [domain] => other.tld
            [type] => 2
        )

    [2] => Array
        (
            [domain] => blaah.tld
            [type] => 2
        )

)

我只想递归地搜索键和值上的所有数组,如果找到键/值则返回 true,如果没有找到则返回 false。

预期输出:

search_multi_array($array, 'domain', 'other.tld'); // Will return true
search_multi_array($array, 'type', 'other.tld'); // Will return false
search_multi_array($array, 'domain', 'google.com'); // Will return false

我想出了一个丑陋的方法,用这个函数在域中搜索所有键:

function search_multi_array($search_value, $the_array) {
    if (is_array($the_array)) {
        foreach ($the_array as $key => $value) {
        $result = search_multi_array($search_value, $value);
        if (is_array($result)) {
            return true;
        } elseif ($result == true) {
            $return[] = $key;
            return $return;
        }
        }
        return false;
    } else {
        if ($search_value == $the_array) {
        return true;
        }
        else
        return false;
    }
}

谁能做得更好,并以更优雅的方式匹配键和值?

【问题讨论】:

    标签: php arrays multidimensional-array


    【解决方案1】:

    如果不超出这两个级别,翻转键/合并会让生活更愉快:

    <?php
    $data = array
    (
        '0' => array
            (
                'domain' => 'example.tld',
                'type' => 2
            ),
    
        '1' => array
            (
                'domain' => 'other.tld',
                'type' => 2,
            ),
    
        '2' => array
            (
                'domain' => 'blaah.tld',
                'type' => 2
            )
    );
    $altered = call_user_func_array('array_merge_recursive',$data);
    var_dump($altered);
    var_dump(in_array('other.tld',$altered['domain']));
    var_dump(in_array('other.tld',$altered['type']));
    var_dump(in_array('google.com',$altered['domain']));
    

    要超越第二级,我们必须遍历所有节点:

    $option2 = array();
    foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($data)) as $key => $value){
            $option2[$key][] = $value;
    }
    var_dump($option2);
    

    【讨论】:

    • 这正是我所追求的。想解释一下为什么这对超过 2 个级别不起作用?
    • 感谢 Wrikken,不胜感激!
    【解决方案2】:

    一种方法是从 [domain] => [indices] 和 [type] => [indices] 创建反向映射。除非您进行大量搜索,否则它可能不会为您节省太多。

    (提示:您可能希望将其包装到一个类中以防止映射不一致)

    另外,任何时候你看到这样的东西:

    if ($search_value == $the_array) {
        return true;
    } else {
        return false;
    }
    

    你总是可以把它变成:

    return $search_value == $the_array;
    

    【讨论】:

      【解决方案3】:

      function search_mutli_array($SearchKey, $SearchValue, $Haystack)
      {
          $Result = false;
          if (is_array($Haystack))
          {
              foreach ($Haystack as $Key => $Value)
              {
                  if (is_array($Value))
                  {
                      if (search_mutli_array($SearchKey, $SearchValue, $Value))
                      {
                          $Result = true;
                          break;
                      }
                  }
                  else if ($SearchKey == $Key && $SearchValue == $Value)
                  {
                      $Result = true;
                      break;
                  }
              }
          }
          return $Result;
      }
      

      【讨论】:

        猜你喜欢
        • 2017-11-16
        • 2014-11-11
        • 1970-01-01
        • 1970-01-01
        • 2014-08-03
        • 1970-01-01
        • 2013-08-29
        • 2014-04-16
        • 1970-01-01
        相关资源
        最近更新 更多