How to Flatten/Convert a Multidimensional Array into a Simple One in PHP?

Problem:

You have a multidimensional array which you want to convert to a one dimensional array.

Solution:

To solve this, we’ll use iterators which are objects from Standard PHP Library. The Standard PHP Library (SPL) is a collection of interfaces and classes used to solve common problems that web developers face everyday efficiently.

If you didn’t use SPL before, don’t fear. It’s easy to use. Similar to any PHP loops, iterator objects can also traverse a list of values of an array. But, the real power of these SPL objects comes when it requires to traverse a complex array like multi-dimensional array which is our agenda here. To traverse a multi-dimensional array, you have to write many lines of codes if you use PHP loops, but, using iterator objects, it just requires few lines of codes.

SPL provides a set of iterators to traverse over objects. Two of those are RecursiveArrayIterator and RecursiveIteratorIterator.

The following code show how to flatten a multidimensional array into a single one-

<pre>
<?php
$month = array(
    array("January"),
    array("February"),
    array("March", "April", array("May", "June")),
    array("July"),
    array("August", "September", "October"),
    array("November", "December")
);

$recur_multi_dimen_arr_obj =  new RecursiveArrayIterator($months);
$recur_flat_arr_obj =  new RecursiveIteratorIterator($recur_multi_dimen_arr_obj);
$flat_arr = iterator_to_array($recur_flat_arr_obj, false);
print_r($flat_arr);
?>
</pre>

[wpdm_file id=46]

Output:
Array
(
    [0] => January
    [1] => February
    [2] => March
    [3] => April    
    [4] => May
    [5] => June
    [6] => July
    [7] => August
    [8] => September
    [9] => October
    [10] => November
    [11] => December
)
Line 12 To traverse the nested arrays recursively inside the multidimensional array $month, we use RecursiveArrayIterator class and makes an object($recur_multi_dimen_arr_obj) of it.
Line 13 RecursiveIteratorIterator will flatten all the elements of the nested arrays and will make it a single array. Note, RecursiveIteratorIterator acts only on recursive iterators, not on an array.  Here, the recursive iterator is $recur_multi_dimen_arr_obj. RecursiveIteratorIterator object will iterate over the RecursiveArrayIterator and will flatten it. If you don’t use this class, you’ll get the root array. To test, inactivate this line and see yourself.
Line 14 iterator_to_array() function copies the elements of the iterator into an array. The second parameter ‘false’ ensures that the keys of one nested array will not be replaced by the keys of its previous nested array if there is more than one nested array.

The code (shorter version):
The above code could be written shortly as –

<pre>
<?php
$data = array(
    array("January"),
    array("February"),
    array("March", "April", array("May", "June")),
    array("July"),
    array("August", "September", "October"),
    array("November", "December")
);

$recur_flat_arr_obj =  new RecursiveIteratorIterator(new RecursiveArrayIterator($months));
$flat_arr = iterator_to_array($recur_flat_arr_obj, false);

print_r($flat_arr);
?>
</pre>

[wpdm_file id=47]

Output:
Same as above

Note: One of the advantages of using SPL classes is that it can flatten any level of multidimensional array.