PHP递归版的函数有什么改进吗?
我创建了一个PHP函数,用于转换数组:PHP递归版的函数有什么改进吗?,php,recursion,Php,Recursion,我创建了一个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
[
'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";
如果输入数组的结构可以具有嵌套结构,那么递归方法有何意义:
[
'one/two' => 3,
'one/four/0' => 5,
'one/four/1' => 6,
'one/four/2' => 7,
'eight/nine/ten' => 11,
'eleven/twelve' => [
'thirteen/fourteen' => 15,
'sixteen/seventeen' => 18,
'nineteen/twenty' => [
'twentyone/twentytwo' => 23
],
],
]
然后,您应该为此实现一个递归函数。当您不需要执行操作时,请保持简单。如果输入数组的结构可以具有嵌套结构,那么递归方法有何意义:
[
'one/two' => 3,
'one/four/0' => 5,
'one/four/1' => 6,
'one/four/2' => 7,
'eight/nine/ten' => 11,
'eleven/twelve' => [
'thirteen/fourteen' => 15,
'sixteen/seventeen' => 18,
'nineteen/twenty' => [
'twentyone/twentytwo' => 23
],
],
]
然后,您应该为此实现一个递归函数。当您不需要实现东西时,请保持它的简单。它可以更短,尽管我通常不使用递归,因为深度无关紧要。你已经掌握了如何使用参考资料。见:
它可以更短,尽管我通常不使用递归,因为深度无关紧要。你已经掌握了如何使用参考资料。见:
读一读。这里的一些有趣的响应可能有用1)在大多数情况下,递归速度较慢,并且占用了更多的堆栈。递归的主要优点是,对于树遍历这样的问题,它使算法更容易或更“优雅”。2) 表达能力大多数问题自然地由递归表示,如斐波那契、合并排序和快速排序。在这方面,代码是为人编写的,而不是为机器编写的。考虑到以上几点,在这种情况下,递归版本可能不太好。我在想我应该保留我所有的一切,好好读一读。这里的一些有趣的响应可能有用1)在大多数情况下,递归速度较慢,并且占用了更多的堆栈。递归的主要优点是,对于树遍历这样的问题,它使算法更容易或更“优雅”。2) 表达能力大多数问题自然地由递归表示,如斐波那契、合并排序和快速排序。在这方面,代码是为人编写的,而不是为机器编写的。考虑到以上几点,在这种情况下,递归版本可能不太好。我想我应该保留我的foreach。是的,这是有道理的,因为我最近在使用递归的堆栈公民的帮助下解决了一个问题。这种情况下,对象中嵌套的对象数量未知(类似于上面描述的情况)。递归使算法更加紧凑,易于理解。在这种特殊情况下,由于没有嵌套结构,我将遵循您的建议并保持简单。仅仅为了使事情复杂化是不明智的。是的,这是有道理的,因为我最近在使用递归的堆栈公民的帮助下解决了一个问题。这种情况下,对象中嵌套的对象数量未知(类似于上面描述的情况)。递归使算法更加紧凑,易于理解。在这种特殊情况下,由于没有嵌套结构,我将遵循您的建议并保持简单。仅仅为了让事情复杂化是不明智的。是的,这样做更好——继续这样做。最初我在对象中添加对象(stdClass)构建它,但JSON在编码时将PHP关联数组视为相同的对象键:值,因此切换到数组。这就解释了这个问题!isset()保留在中。传递引用“&”在函数参数列表中没有空格,在函数体的变量赋值中变量之间只有一个空格,这有什么意义?@ponytails\u soda:没有意义,可以是$temp=&$result代码>。出于某种原因,我习惯了用另一种方式。我一直看到有人这么做,我想知道这是否是公认的最佳实践。是的,这更好——用这个。最初我在对象中添加对象(stdClass)构建它,但JSON在编码时将PHP关联数组视为相同的对象键:值,因此切换到数组。这就解释了这个问题!isset()保留在中。传递引用“&”在函数参数列表中没有空格,在函数体的变量赋值中变量之间只有一个空格,这有什么意义?@ponytails\u soda:没有意义,可以是$temp=&$result代码>。出于某种原因,我习惯了用另一种方式。我一直看到人们这样做,我想知道这是否是公认的最佳实践。