Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP递归版的函数有什么改进吗?_Php_Recursion - Fatal编程技术网

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

我创建了一个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";

如果输入数组的结构可以具有嵌套结构,那么递归方法有何意义:

[
'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。出于某种原因,我习惯了用另一种方式。我一直看到人们这样做,我想知道这是否是公认的最佳实践。