【问题标题】:PHP looping multidimensional arrayPHP循环多维数组
【发布时间】:2012-05-13 23:04:29
【问题描述】:

不完全确定如何恰当地命名这个问题,但它需要遍历嵌套在数组中的任何数组,其中也可能是任何其他数组的元素 - 等等。最初,我认为需要标记哪些数组尚未循环,哪些数组已经循环,以完全循环“基础”数组(尽管了解到这不是必需的,而且 PHP 以某种方式任意执行此操作) .问题似乎有点奇怪——如果省略了用于测试是否未找到值的条件子句,则该函数将在任何地方找到嵌套在数组中的值,反之亦然。反正函数如下:

function loop($arr, $find) {
  for($i=0;$i<count($arr);$i++) {
    if($arr[$i] == $find) {
      print "Found $find";
      return true;
    } else {
      if(is_array($arr[$i])) {
         $this->loop($arr[$i], $find);
      } else {
         print "Couldn't find $find";
         return false;
      }
    }
   }
 }

【问题讨论】:

  • 请问有什么问题?
  • @Tibor,使用foreach 比使用for 慢,这与小数组无关,但对于多级数组(尤其是大数组)会有很好的速度差异......
  • 创建一个栈来保存父数组的位置,循环遍历子数组,如果遇到子数组中的子元素,然后将当前位置压入堆栈并开始循环遍历孙子数组,toerhwsie if你完成了孩子然后弹出堆栈并从你离开堆栈的点继续循环通过父母
  • @shadyyx:真的有这样的区别吗?我没有检查,但我通常不明白为什么会有一个。您对此有任何参考或进行过任何测试吗?
  • @Tibor 对不起,我的错。我记错了。我在 SE (stackoverflow.com/questions/3430194/…) 阅读了一个基准测试并记错了 - 似乎foreach 甚至比for 还要快一点。请接受我的道歉。但是随着时间的推移,这个测试显示出不同的结果:codepad.org/STW1Jd4j

标签: php arrays loops multidimensional-array


【解决方案1】:

也许您应该将代码更改为:

var $found = false;
function loop($arr, $find) {
  foreach($arr as $k=>$v){
    if($find==$v){
      $this->found = true;
    }elseif(is_array($v)){
      $this->loop($v, $find);
    }
  }
  return $this->found;
}

【讨论】:

    【解决方案2】:

    这已经为我工作了一段时间。

    function array_search_key( $needle_key, $array ) {
      foreach($array AS $key=>$value){
        if($key == $needle_key) return $value;
        if(is_array($value)){
          if( ($result = array_search_key($needle_key,$value)) !== false)
            return $result;
        }
      }
      return false;
    }
    

    【讨论】:

      【解决方案3】:

      好的,稍微修改一下怎么样:

      function loop($arr, $find) {
          for($i=0;$i<count($arr);$i++) {
              if(is_array($arr[$i])) {
                  $this->loop($arr[$i], $find);
              } else {
                  if($arr[$i] == $find) {
                      print "Found $find";
                      return true;
                  }
              }
          }
          return false;
      }
      

      嗯?

      【讨论】:

        【解决方案4】:

        【讨论】:

          猜你喜欢
          • 2013-06-25
          • 2019-07-17
          • 1970-01-01
          • 2013-10-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-24
          • 2012-04-21
          相关资源
          最近更新 更多