Я думаю, это то, что вы хотите
$ritit = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr));
$result = array();
foreach ($ritit as $leafValue) {
$path = 'foo99';
foreach (range(0, $ritit->getDepth()) as $depth) {
$path .= sprintf('[%s]', $ritit->getSubIterator($depth)->key());
}
$result[$path] = $leafValue;
}
По умолчанию RecursiveIteratorIterator посещает только конечные узлы, поэтому на каждой итерации цикла внешнего foreach структура итератора останавливается на одном из значений, которые вас интересуют. Мы находим ключи, которые строят наш путь туда, где мы находимся, заглядывая в итераторы, которые RecursiveIteratorIterator создает и управляет для нас (один итератор используется для каждого уровня).