当阵列可能嵌套时,php foreach on array

时间:2014-04-05 17:46:54

标签: php arrays foreach

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

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

这只有在您知道数组可能只嵌套一层深度

时才有效

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

5 个答案:

答案 0 :(得分:1)

您可以使用array_walk_recursive。例如:

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

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

答案 1 :(得分:0)

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

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

这就是print_r可以这样做的方式(见评论)。

答案 2 :(得分:0)

你想使用递归,你想在你找到一个数组时调用你自己的打印函数,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);

答案 3 :(得分:0)

试试这个 -

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");

答案 4 :(得分:0)

您可以使用递归函数,但最大深度将由最大嵌套限制确定(请参阅此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);

我希望有所帮助。