В другом потоке я спросил о том, чтобы сгладить массив с определенным стилем, чтобы получить что-то вроде этого:
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 или выше, но если это проблема, есть простое однострочное решение (спросите, хотите ли вы).