Свести массив PHP - PullRequest
       12

Свести массив PHP

2 голосов
/ 24 апреля 2010

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

<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
)

Ответы [ 3 ]

4 голосов
/ 24 апреля 2010

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

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

0 голосов
/ 24 апреля 2010

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

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

выход

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

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

0 голосов
/ 24 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...