【问题标题】:Iterating over a complex Associative Array in PHP在 PHP 中迭代复杂的关联数组
【发布时间】:2010-09-06 18:17:24
【问题描述】:

有没有一种简单的方法可以在 PHP 中迭代这种结构的关联数组:

数组$searches 有一个编号索引,有4 到5 个关联部分。所以我不仅需要遍历$searches[0]$searches[n],还需要遍历$searches[0]["part0"]$searches[n]["partn"]。困难的部分是不同的索引有不同数量的部分(有些可能缺少一两个)。

想以一种很好、简洁且易于理解的方式来做这件事吗?

【问题讨论】:

    标签: php arrays associative-array


    【解决方案1】:

    嵌套两个foreach loops:

    foreach ($array as $i => $values) {
        print "$i {\n";
        foreach ($values as $key => $value) {
            print "    $key => $value\n";
        }
        print "}\n";
    }
    

    【讨论】:

    • 是 $i 和 $values 从关联数组复制临时变量还是引用实际数组引用?
    • @MMAmail.com:此代码不使用引用,它使用副本。如果你真的想使用引用(但你通常不这样做!)你需要在变量名前加上和号,即&$i&$values在他们的声明中,你应该unset循环后的变量。
    【解决方案2】:

    我知道这是问题死灵法,但是使用 Spl 迭代器迭代多维数组很容易

    $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($array));
    
    foreach($iterator as $key=>$value) {
        echo $key.' -- '.$value.'<br />';
    }
    

    【讨论】:

    • 如果数组元素之一是可迭代对象会发生什么?
    • 你知道如何排除它被迭代吗?所以只有数组被迭代?
    • @Petah 将迭代器包装到 FilterIterator 中,在 accept() 方法中检查 is_object。
    【解决方案3】:

    看起来是递归函数的好地方,尤其是。如果你有两个以上的深度。

    function doSomething(&$complex_array)
    {
        foreach ($complex_array as $n => $v)
        {
            if (is_array($v))
                doSomething($v);
            else
                do whatever you want to do with a single node
        }
    }
    

    【讨论】:

      【解决方案4】:

      您应该能够使用嵌套的 foreach 语句

      来自php manual

      /* foreach example 4: multi-dimensional arrays */
      $a = array();
      $a[0][0] = "a";
      $a[0][1] = "b";
      $a[1][0] = "y";
      $a[1][1] = "z";
      
      foreach ($a as $v1) {
          foreach ($v1 as $v2) {
              echo "$v2\n";
          }
      }
      

      【讨论】:

        【解决方案5】:

        你能遍历所有的“part[n]”项并使用 isset 来查看它们是否真的存在吗?

        【讨论】:

          【解决方案6】:

          我真的不确定你在这里的意思 - 一对 foreach 循环肯定能满足你的需要吗?

          foreach($array as $id => $assoc)
          {
              foreach($assoc as $part => $data)
              {
                  // code
              }
          }
          

          或者你需要一些递归的东西吗?我可以在示例数据和您希望如何返回数据的上下文方面提供更多帮助。

          【讨论】:

            【解决方案7】:

            考虑一下这个多维数组,希望这个函数能有所帮助。

            $n = array('customer' => array('address' => 'Kenmore street',
                            'phone' => '121223'),
                  'consumer' => 'wellington consumer',
                  'employee' => array('name' => array('fname' => 'finau', 'lname' => 'kaufusi'),
                                 'age' => 32,
                             'nationality' => 'Tonga')
                  );
            
            
            
            iterator($n);
            
            function iterator($arr){
            
                foreach($arr as $key => $val){
            
                if(is_array($val))iterator($val);
            
                echo '<p>key: '.$key.' | value: '.$val.'</p>';
            
                //filter the $key and $val here and do what you want
                }
            
            }
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2016-08-04
              • 2019-05-11
              • 1970-01-01
              • 2011-03-07
              • 1970-01-01
              • 2013-12-17
              相关资源
              最近更新 更多