Сгладить массив PHP

Скажем, у меня есть форма с этими полями и не могу переименовать их:

<input type="text" name="foo[bar]" />
<input type="text" name="foo[baz]" />
<input type="text" name="foo[bat][faz]" />

При представлении PHP превращает это в массив:

Array
(
    [foo] => Array
        (
            [bar] => foo bar
            [baz] => foo baz
            [bat] => Array
                (
                    [faz] => foo bat faz
                )

        )

)

Какие существуют методы для преобразования или сглаживания этого массива в структуру данных, например:

Array
(
    [foo[bar]] => foo bar
    [foo[baz]] => foo baz
    [foo[bat][faz]] => foo bat faz
)

Ответ 1

Я думаю, что это то, что вы хотите

$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 создает и управляет для нас (один итератор используется для каждого уровня).

Ответ 2

Может быть, это глупый ответ, но почему бы не сделать это

<input type="text" name="foobar" />
<input type="text" name="foobaz" />
<input type="text" name="foobatfaz" />

?

Ответ 3

Не ответ на ваш вопрос, но альтернативно есть extract, который будет принимать массив и производить переменные из них. например,

$array = array
    (
        [foo] => foo bar
        [boo] => something else
    )
extract($array);

Выход

$foo = 'foo bar';
$boo = 'something else';

Существует несколько вариантов обработки одинаковых имен индексов, например, для записи существующего значения или добавления префикса к имени переменной.