Intereting Posts
PDO: «Недопустимый номер параметра» при подстановке нескольких параметров с одинаковым значением PHP, как найти корень приложения? Получите переменные GET из строки URL Невозможно получить доступ к моим данным профиля при доступе к API google-people PHP-скрипт, который работает навсегда :) Преобразование из MySQL datetime в другой формат с помощью PHP насколько зрелым является HTML + CSS в отношении создания отчетов для печати? Выберите два последовательных слова регулярным выражением Могу ли я высмеять реализацию интерфейса с помощью PHPUnit? как обновить раскрывающееся меню Select2 после загрузки ajax другого контента? Ошибка php return 500, но не журнал ошибок WooCommerce: настраиваемая функция для управления запасами переменных продуктов на уровне отдельных атрибутов PHP создать файл для загрузки без сохранения на сервере Что означает $ this на самом деле> Codeigniter Как пройти время в «highcharts»?

Обратный скошенный массив к многомерному

В другом потоке я спросил о том, чтобы сгладить массив с определенным стилем, чтобы получить что-то вроде этого:

array(4) { ["one"]=> string(9) "one_value" ["two-four"]=> string(10) "four_value" ["two-five"]=> string(10) "five_value" ["three-six-seven"]=> string(11) "seven_value" } 

У меня там очень хорошая помощь, но теперь мне интересно, как бы я отменил этот метод, чтобы снова получить тот же оригинальный массив:

 array( 'one' => 'one_value', 'two' => array ( 'four' => 'four_value', 'five' => 'five_value' ), 'three' => array ( 'six' => array ( 'seven' => 'seven_value' ) ) ) 

Я пробовал рекурсивный метод, но не повезло. Я благодарю всю помощь заранее!

 function expand($flat) { $result = array(); foreach($flat as $key => $val) { $keyParts = explode("-", $key); $currentArray = &$result; for($i=0; $i<count($keyParts)-1; $i++) { if(!isSet($currentArray[$keyParts[$i]])) { $currentArray[$keyParts[$i]] = array(); } $currentArray = &$currentArray[$keyParts[$i]]; } $currentArray[$keyParts[count($keyParts)-1]] = $val; } return $result; } 

Обратите внимание, что приведенный выше код не тестируется и предоставляется только для иллюстрации идеи. Оператор & используется для $currentArray для хранения не значения, а ссылки на некоторый узел в вашем дереве (реализуемый многомерным массивом), так что изменение $currentArray также изменит $result .

Вот эффективное рекурсивное решение:

 $foo = array( "one" => "one_value", "two-four" => "four_value", "two-five" => "five_value", "three-six-seven" => "seven_value" ); function reverser($the_array) { $temp = array(); foreach ($the_array as $key => $value) { if (false != strpos($key, '-')) { $first = strstr($key, '-', true); $rest = strstr($key, '-'); if (isset($temp[$first])) { $temp[$first] = array_merge($temp[$first], reverser(array(substr($rest, 1) => $value))); } else { $temp[$first] = reverser(array(substr($rest, 1) => $value)); } } else { $temp[$key] = $value; } } return $temp; } print_r(reverser($foo)); 

strstr(___, ___, true) работает только с PHP 5.3 или выше, но если это проблема, есть простое однострочное решение (спросите, хотите ли вы).