【发布时间】:2018-03-19 23:54:27
【问题描述】:
我创建了一个可以转换数组的 PHP 函数:
[
'one/two' => 3,
'one/four/0' => 5,
'one/four/1' => 6,
'one/four/2' => 7,
'eight/nine/ten' => 11,
]
转入以下 JSON 字符串:
{
"one":
{
"two": 3,
"four": [ 5,6,7]
},
"eight":
{
"nine":
{
"ten":11
}
}
}
函数如下:
<?php
function toJsonStr($array) {
$final_array = [];
foreach ($array as $key => $value) {
$key_exploded = explode("/", $key);
$array_index_at_end = is_numeric(end($key_exploded)) ? true : false ;
if ($array_index_at_end === true) {
$array_index = array_pop($key_exploded);
}
$ref = &$final_array;
foreach ($key_exploded as $value2) {
if (!isset($ref[$value2])) {
$ref[$value2] = [];
}
$ref = &$ref[$value2];
}
if ($array_index_at_end === true) {
$ref[$array_index]=$value;
} else {
$ref=$value;
}
}
return json_encode($final_array);
}
$array = [
'one/two' => 3,
'one/four/0' => 5,
'one/four/1' => 6,
'one/four/2' => 7,
'eight/nine/ten' => 11,
];
$json_str = toJsonStr($array);
echo "\n";
print_r($json_str);
echo "\n\n";
我几乎肯定这也可以递归完成。我是递归新手,在创建递归版本时无法构建方法。
创建递归版本是否值得?与我上面实现的 foreach 中的简单 foreach 相比,也许它太难理解了?
我知道递归算法可以简化代码并使代码更紧凑,但在这种情况下是否值得?
【问题讨论】:
-
阅读stackoverflow.com/questions/5250733/…。这里有一些有趣的回应可能有用
-
1)在大多数情况下,递归速度较慢,并且占用了更多的堆栈。递归的主要优点是,对于像树遍历这样的问题,它使算法更容易或更“优雅”。 2)表达性 大多数问题自然地用递归来表达,例如斐波那契、归并排序和快速排序。在这方面,代码是为人类而不是机器编写的。考虑到以上几点,可能递归版本在这种情况下并不好。我想我应该只保留我拥有的 foreach。