Сгладить массив 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';
Существует несколько вариантов обработки одинаковых имен индексов, например, для записи существующего значения или добавления префикса к имени переменной.