Reading this question Merge and group by several arrays i got the following idea: when working with multilevel arrays, with possibly repeating keys, it would be practical to
You can also write a simple traversal function:
function flatten($node, $fn, $keys = array()) {
if (! is_array($node)) {
$fn($node, $keys);
} else {
foreach ($node as $k => $v) {
$new_keys = $keys;
$new_keys[] = $k;
flatten($v, $fn, $new_keys);
}
}
}
$array = array(
0 => 'a',
1 => array('subA','subB',array(0 => 'subsubA', 1 => 'subsubB', 2 => array(0 => 'deepA', 1 => 'deepB'))),
2 => 'b',
3 => array('subA','subB','subC'),
4 => 'c'
);
// will output: a subA subB subsubA subsubB deepA deepB b subA subB subC c
flatten($array, function($v, $k) {
echo $v . ' ';
});
If you don't want to call it each time with another function as a parameter, I've also written an adapter that will return an array:
function flatten_array($node) {
$acc = array();
flatten($node, function($node, $keys) use (&$acc) {
$acc[implode('.', $keys)] = $node;
});
return $acc;
}
// will spit out the same output as that in Yoshi's answer:
foreach (flatten_array($array) as $k => $v) {
echo $k .' => ' . $v . "\n";
}
Notes:
call_user_func.