【问题标题】:php foreach on array when arrays might be nested当数组可能嵌套时,数组上的 php foreach
【发布时间】:2014-04-05 17:46:53
【问题描述】:

以下代码在数组上使用 foreach,如果值是数组,则对嵌套数组中的每个执行一次操作

foreach ($playfull as $a)
{
    if (is_array($a))
    {
        foreach ($a as $b)
        {
            print($b);
            print("<p>");
        }
    } else {
        print($a);
        print("<p>");
    }
}

这只有在你知道数组只能嵌套一层时才有效

如果数组可以嵌套未知数量的深度,您如何获得相同的结果? (期望的结果是打印每个数组中每个键的值,无论它们嵌套多深)

【问题讨论】:

  • 递归就是你要找的
  • 你是否关心关闭你打开的那些&lt;p&gt;标签?
  • 这不是一个 HTML 问题,我只使用 thoe 在输出中进行换行哦,是的,我知道
    和 print_r() 是做什么的。

标签: php arrays foreach


【解决方案1】:

您可以使用array_walk_recursive。示例:

array_walk_recursive($array, function (&$val) 
{ 
      print($val);
    }

这个函数是PHP内置函数,很短。

【讨论】:

    【解决方案2】:

    使用递归函数(即调用自身的函数):

    function print_array_recursively($a)
    {
        foreach ($a as $el)
        {
            if (is_array($el))
            {
                print_array_recursively($el);
            }
            else
            {
                print($el);
            }
        }
    }
    

    就是这样,print_r 可以做到(见 cmets)。

    【讨论】:

    • 真实,除了“这是这样的,print_r 做到了。”部分,这是不完全正确的。 print_r 做得好多了。
    【解决方案3】:

    你想使用递归,你想调用你的打印函数,每当你找到一个数组时,click here to see an example

    $myArray = array(
       "foo",
       "bar",
       "children" => array(
         "biz",
         "baz"),
       "grandchildren" => array(
         "bang" => array(
           "pow",
           "wow")));
    
    
     function print_array($playfull) 
     {
       foreach ($playfull as $a)
         {
           if (is_array($a))
             {
               print_array($a);
             } else {
               echo $a;
               echo "<p>";
           }
         }
     }
    
     echo "Print Array\n";
     print_array($myArray);
    

    【讨论】:

      【解决方案4】:

      您可以使用递归函数,但最大深度将由最大嵌套限制确定(请参阅此 SO 问题 Increasing nesting functions calls limit,了解有关在需要时增加该限制的详细信息)

      这是一个例子:

      $array = array(1,array(2,3,array(4,5)),6,7,8);
      function printArray($item)
      {
          foreach ($item as $a)
          {
              if (is_array($a))
              {
                  printArray($a);
              } else {
                  print($a);
                  print("<p>");
              }
          }
      }
      printArray($array);
      

      希望对你有帮助。

      【讨论】:

        【解决方案5】:

        试试这个 -

        function array_iterate($arr, $level=0, $maxLevel=0) 
        { 
            if (is_array($arr)) 
            { 
                // unnecessary for this conditional to enclose 
                // the foreach loop 
                if ($maxLevel < ++$level) 
                { $maxLevel = $level; } 
        
                foreach($arr AS $k => $v) 
                { 
                    // for this to work, the result must be stored 
                    // back into $maxLevel 
                    // FOR TESTING ONLY: 
                    echo("<br>|k=$k|v=$v|level=$level|maxLevel=$maxLevel|"); 
                    $maxLevel= array_iterate($v, $level, $maxLevel); 
                } 
                $level--; 
            } 
        
            // the conditional that was here caused all kinds 
            // of problems. so i got rid of it 
            return($maxLevel); 
        } 
        
        $array[] = 'hi'; 
        $array[] = 'there'; 
        $array[] = 'how'; 
        $array['blobone'][] = 'how'; 
        $array['blobone'][] = 'are'; 
        $array['blobone'][] = 'you'; 
        $array[] = 'this'; 
        $array['this'][] = 'is'; 
        $array['this']['is'][] = 'five'; 
        $array['this']['is']['five'][] = 'levels'; 
        $array['this']['is']['five']['levels'] = 'deep'; 
        $array[] = 'the'; 
        $array[] = 'here'; 
        
        $var = array_iterate($array); 
        echo("<br><br><pre>$var");
        

        【讨论】:

          猜你喜欢
          • 2011-04-10
          • 2016-06-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-25
          • 2019-12-01
          • 1970-01-01
          相关资源
          最近更新 更多