【问题标题】:Search for values in nested array在嵌套数组中搜索值
【发布时间】:2010-04-22 18:14:08
【问题描述】:

我有一个数组如下

array(2) {
  ["operator"] => array(2) {
    ["qty"] => int(2)
    ["id"] => int(251)
  }
  ["accessory209"] => array(2) {
    ["qty"] => int(1)
    ["id"] => int(209)
  }
  ["accessory211"] => array(2) {
    ["qty"] => int(1)
    ["id"] => int(211)
  }
}

我正在尝试找到一种方法来验证数组中是否存在 id 值并返回 bool。我试图找出一种不需要创建循环的快速方法。使用 in_array 函数不起作用,我还读到它很慢。

在 php 手册中有人推荐使用 flip_array() 然后 isset(),但我无法让它适用于二维数组。

做类似的事情

if($array['accessory']['id'] == 211)

也可以为我工作,但我需要匹配所有包含附件的键——不知道该怎么做

无论如何,我在兜圈子,需要一些帮助。 这似乎应该很容易。谢谢。

【问题讨论】:

  • 我要建议的 PHP 函数之一是 array_walk_recursive,它不需要您执行循环。但是,如果您的 key 像您的那样具有数组值,则该功能不起作用。循环可能是唯一的方法。请问为什么没有循环?
  • @Anthony Forloney:我有点困惑。这个函数应该完全符合 OP 的要求。你能更好地解释为什么它不起作用吗?我看到的唯一问题是,即使已经找到匹配项,它也会遍历所有值。
  • 好吧,当我检查该值是否存在时,它已经遍历了要匹配的 id(包含在对象中)的所有值。我只是想减少搜索时间。
  • @Felix,我从网站上找到了这个:任何包含数组的键都不会传递给函数。而 OP 的数组具有包含数组的键。除非我误解了那句话,否则具有数组值的键似乎不会被传递到函数中,这不是他问题的答案。
  • @Anthony Forloney:是的,但这没关系。它以递归方式工作。保存数组的键不会传递给函数,这是真的。 但是这个(子)数组中的键被传递了。所以它完全按照你最初描述的方式工作。而不是例如operator,子数组中的元素被传递(即qtyid),您可以检查它们。看看文档中的例子......但是由于OP只想搜索idarray_walk确实更容易。

标签: php multidimensional-array


【解决方案1】:

array_walk() 可用于检查特定值是否在数组中; - 它遍历所有传递给作为第二个参数提供的函数的数组元素。例如,该函数可以调用如下代码。

function checkValue($value, $key) {
  echo $value['id'];
}

$arr = array(
  'one' => array('id' => 1),
  'two' => array('id' => 2),
  'three' => array('id' => 3)
);

array_walk($arr, 'checkValue');

【讨论】:

  • 您应该添加一个文档链接,并提到您可以将第三个参数传递给array_walk,该参数将再次传递给回调函数(即这是传递@987654325 @ 搜索)。
  • 我可以让函数返回一个布尔值吗?我无法让那部分工作?
  • array_walk 返回 true 或 false,但取决于回调是否成功执行 - 您可以使用标志(全局变量)来指示是否找到了您要查找的值。
  • 感谢 falomir 和 Felix 的帮助。我想我可以让这项工作满足我的需求。
【解决方案2】:

这个函数很有用in_array(211, $array['accessory']);它会验证整个指定的数组,看看你的值是否存在并返回true。

in_array

【讨论】:

    【解决方案3】:
    $map = array();
    foreach ($arr as $v) {
        $map[$v['id']] = 1;
    }
    //then you can just do this as when needed
    $exists = isset($map[211]);
    

    或者如果您需要与之关联的数据

    $map = array();
    foreach ($arr as $k => $v) {
        $map[$v['id']][$k] = $v;
    }
    print_r($map[211]);
    

    【讨论】:

      【解决方案4】:
      <?php
      
      //PHP 5.3 way to do it
      
      function searchNestedArray(array $array, $search, $mode = 'value') {
      
          foreach (new RecursiveIteratorIterator(new RecursiveArrayIterator($array)) as $key => $value) {
              if ($search === ${${"mode"}})
                  return true;
          }
          return false;
      }
      
      $data = array(
          array('abc', 'ddd'),
          'ccc',
          'bbb',
          array('aaa', array('yyy', 'mp' => 555))
      );
      
      var_dump(searchNestedArray($data, 555));
      

      【讨论】:

        【解决方案5】:

        我使用了一个静态方法,因为我在一个类中需要它,但如果你愿意,你可以将它用作一个简单的函数。

        /**
         * Given an array like this
         * array(
         *   'id' => "first",
         *   'title' => "First Toolbar",
         *   'class' => "col-md-12",
         *   'items' => array(
         *       array(
         *           'tipo' => "clientLink",
         *           'id' => "clientLinkInsert"
         *       )
         *   )
         * )
         *
         * and array search like this
         * array("items", 0, "id")
         * 
         * Find the path described by the array search, in the original array
         *
         * @param array $array source array
         * @param array $search the path to the item es. ["items", 0, "tipo"]
         * @param null|mixed $defaultIfNotFound the default value if the value is not found
         *
         * @return mixed
         */
        public static function getNestedKey($array, $search, $defaultIfNotFound = null)
        {
            if( count($search) == 0 ) return $defaultIfNotFound;
            else{
                $firstElementSearch = self::array_kshift($search);
        
                if (array_key_exists($firstElementSearch, $array)) {
                    if( count($search) == 0 )
                        return $array[$firstElementSearch];
                    else
                        return self::getNestedKey($array[$firstElementSearch], $search, $defaultIfNotFound);
                }else{
                    return $defaultIfNotFound;
                }
            }
        }
        

        【讨论】:

          【解决方案6】:

          你可以使用

          Arr::getNestedElement($array, $keys, $default = null)
          

          this 库中使用指定的键(如'key1.key2.key3'['key1', 'key2', 'key3'])从多维数组中获取值,如果未找到元素则回退到默认值。使用您的示例,它将如下所示:

          if (Arr::getNestedElement($array, 'accessory.id') == 211)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-01-18
            • 1970-01-01
            • 2016-08-16
            • 1970-01-01
            • 2013-08-10
            • 2021-09-18
            • 2018-05-06
            • 2018-03-20
            相关资源
            最近更新 更多