在另一个thread中,我问过将一个具有特定样式的数组展平以得到这样的结果:
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'
)
)
)
我尝试过递归方法,但没有运气。 我提前感谢所有的帮助!
答案 0 :(得分:2)
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
也是。
答案 1 :(得分:0)
这是一个有效的递归解决方案:
$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或更高版本,但如果这是一个问题,则有一个简单的单行解决方案(询问您是否喜欢它)。