【问题标题】:Find nested array element, return node (most efficient way) [duplicate]查找嵌套数组元素,返回节点(最有效的方式)[重复]
【发布时间】:2013-08-25 10:08:37
【问题描述】:

查看关联数组的数组以找到符合参数的节点的最有效方法是什么?

我希望有一种更有效的方式来查看数组以查找并返回父节点,这只是循环 - 查看每个元素并在匹配时返回。 (也可以安全地假设,没有重复的数据 - 所以第一个找到的就是唯一找到的)

还是 for 循环是我得到的最好的东西?

例如

array(
[0] => array('name' => 'fred'),
[1] => array('name' => 'dave'),
[2] => array('name' => 'mike)
)

并且想要获取名称 == 'dave' 的数据节点,或者查看实际上是否存在将元素名称设置为 'dave' 的节点。

例如有点像

isset($data[]['name'] == 'dave')
$info = getdata($data[]['name'] == 'dave')

(抱歉,如果我没有使用正确的技术术语,请按照我喜欢学习的方式纠正我!)

非常感谢您的任何建议! =)

【问题讨论】:

标签: php arrays performance


【解决方案1】:

没有比循环更好的方法了。 PHP 无法执行任何不涉及依次查看每个元素的魔法。

如果您经常这样做,它有助于按搜索条件对数组进行索引:

$data = array(
    array('name' => 'Dave'),
    array('name' => ...)
);

$indexedData = array();
foreach ($data as $datum) {
    $indexedData[$datum['name']] = $datum;
}

$info = $indexedData['Dave'];

只要您的数据结构是次优的,就只有次优的方法可以访问它。

【讨论】:

    【解决方案2】:

    这是一个数组递归到一级的函数。我们使用foreach()循环遍历每一层子数组,然后使用内置函数array_search查看是否存在。

        function as_nested($needle,$haystack){
        $val;
            foreach($haystack as $key=>$arr){
                $arr_key = array_search($needle,$haystack[$key]);
                if(!empty($arr_key)){
                 $val = $key;
                }
            }
         return $val;
        }
    

    要执行,你先提供针,然后是大海捞针。

    echo as_nested('dave',$myArray);
    

    输出使用您的初始数组是1

        $myArray[0] = array('name'=>'fred');
        $myArray[1] = array('name' => 'dave');
        $myArray[2] = array('name' => 'mike');
    

    【讨论】:

      【解决方案3】:

      php 中有一个名为in_array() 的函数,它在数组中查找值。

      //Code credit to @deceze
      $data = array(
          array('name' => 'Dave'),
          array('name' => ...)
      );
      
      function getData($data, $searchValue) {
          foreach ($data as $datum) {
              if (in_array($searchValue, $datum)) {
              return $datum;
          }
      }
      //array returned when $searchValue is found.
      

      您可以使用 getData 函数在数组中搜索值(这不是特定于索引的。即不受名称等限制)

      【讨论】:

      • in_array 也在内部循环,所以真的没什么大不了的。
      • @deceze 有趣。我觉得确实如此,但我是这样做的(在函数中),因为询问者使用了 getData 函数
      猜你喜欢
      • 2012-10-22
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多