【问题标题】:PHP - Searching in multidimensional arrayPHP - 在多维数组中搜索
【发布时间】:2017-03-23 04:48:08
【问题描述】:

我很头疼,请指教。我有以下情况:

  • 我有下一个多维数组:

    $numbers = array (
        "one_digit" => array (1,2,3,4,5),
        "two_digits" => array (20,21,22,23,24,25),
        "three_digits" => array (301,302,303,304,304),
        "mixed_digits" => array (9,29,309,1)
    );
    
  • 我需要一种在 $numbers 数组中搜索以下内容的方法:

    -- 搜索数字 20 是否在任何 $numbers 数组中,并在找到的地方回显 前任。 $find1 = m_array_search("20", $numbers); echo "我在 ".$find1." 的 $numbers 子数组中找到了搜索的值"; 结果:“我在 $numbers 的 two_digits 子数组中找到了搜索值”

    -- 搜索数字 1 是否在任何 $numbers 数组中并回显找到它的位置 前任。 $find2 = m_array_search("1", $numbers); echo "我在 ".$find2." 的 $numbers 子数组中找到了搜索到的值"; 结果:“我在 $numbers 的 two_digits,mixed_digits 子数组中找到了搜索值”

因此函数必须能够发现一个或多个“子数组”中的存在。对不起,如果我用错了“子数组”这个词

谢谢!!!

【问题讨论】:

    标签: php arrays multidimensional-array


    【解决方案1】:

    检查一下,如果对您有帮助,请告诉我。

    <?php
    function array_find_deep($array, $search, $keys = array())
    {
        foreach($array as $key => $value) {
            if (is_array($value)) {
                $sub = array_find_deep($value, $search, array_merge($keys, array($key)));
                if (count($sub)) {
                    return $sub;
                }
            } elseif ($value === $search) {
                return array_merge($keys, array($key));
            }
        }
    
        return array();
    }
    
    
    $numbers = array (
        "one_digit" => array (1,2,3,4,5), 
        "two_digits" => array (20,21,22,23,24,25),
        "three_digits" => array (301,302,303,304,304),
        "mixed_digits" => array (9,29,309,1)
    );
    
    var_dump(array_find_deep($numbers, 20));
    
    var_dump(array_find_deep($numbers, 1));
    
    var_dump(array_find_deep($numbers, 301));
    
    var_dump(array_find_deep($numbers, 309));
    
    ?>
    

    您可以将结果存储在像$result = array_find_deep($numbers, 20); 这样的变量中,然后尝试echo $result[0],这将给出它在哪个数组中找到值的结果。

    【讨论】:

      【解决方案2】:

      使用in_array函数的简单解决方案:

      $search = 1;
      $keys = [];
      foreach ($numbers as $k => $v) {
          if (is_array($v) && in_array($search, $v)) $keys[] = $k;
      }
      
      echo "I've found the searched value in ". implode(', ', $keys) ." subarray". ((count($keys) > 1)? "s":"") ." of \$numbers";
      

      输出:

      I've found the searched value in one_digit, mixed_digits subarrays of $numbers
      

      【讨论】:

      • @BogdanWebb 这是页面上的最佳答案(您可以省略is_array() 检查;我愿意)。 array_search() 当您只想从每个子数组检查中获得真/假结果时,就太过分了。您可能需要重新考虑。
      【解决方案3】:

      您可以在循环中使用array_search() 尝试此操作 -

      $numbers = array (
          "one_digit" => array (1,2,3,4,5),
          "two_digits" => array (20,21,22,23,24,25),
          "three_digits" => array (301,302,303,304,304),
          "mixed_digits" => array (9,29,309,1)
      );
      
      function search_value($array, $value)
      {
        $result = array();
        foreach($array as $key => $sub) {
          // check if element present in sub array
          if(array_search($value, $sub) !== false) {
            // store the key
            $result[] = $key;
          }
        }
        return $result;
      }
      
      var_dump(search_value($numbers, 1));
      var_dump(search_value($numbers, 5));
      

      输出

      array(2) {
        [0]=>
        string(9) "one_digit"
        [1]=>
        string(12) "mixed_digits"
      }
      array(1) {
        [0]=>
        string(9) "one_digit"
      }
      

      【讨论】:

        猜你喜欢
        • 2016-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-06-27
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        • 2011-05-20
        相关资源
        最近更新 更多