So far, if I have to loop through a multidimensional array, I use a foreach loop for each dimension.
e.g for two dimensions
foreach($array as $key=>$value)
{
foreach($value as $k2=>$v2)
{
echo
}
}
What do I do when I don't know the depth of the array? ie the depth is variable.
The only thing I can think of is to code a whole stack of loops and to break the loop if the next value is not an array.This seems a little silly.
Is there a better way?
Simple function inside
array_walk_recursive
to show the level of nesting and the keys and values:Another one showing
use
with a reference to get a result:Based on previous recursion examples, here is a function that keeps an array of the path of keys a value is under, in case you need to know how you got there:
You can do the below function for loop-through-a-multidimensional-array-without-knowing-its-depth
by using above function, it will go through each of the multi dimensional array, below is the sample array you could pass to loop function :
Yes, you can use recursion. Here's an example where you output all the elements in an array:
What you should always remember when doing recursion is that you need a base case where you won't go any deeper.
I like to check for the base case before continuing the function. That's a common idiom, but is not strictly necessary. You can just as well check in the
foreach
loop if you should output or do a recursive call, but I often find the code to be harder to maintain that way.The "distance" between your current input and the base case is called a variant and is an integer. The variant should be strictly decreasing in every recursive call. The variant in the previous example is
the depth of $a
. If you don't think about the variant you risk ending up with infinite recursions and eventually the script will die due to a stack overflow. It's not uncommon to document exactly what the variant is in a comment before recursive functions.You can use recursion for this problem:
Here is one example
It will use recursion to loop through array
It will print like