PHP递归版本的函数有任何改进



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

我几乎肯定这也可以递归完成。我是递归新手,在创建递归版本时无法构建方法。

甚至值得创建一个递归版本吗?也许与我上面实现的 foreach 中的简单 foreach 相比,它太难理解了?

我知道递归算法简化并使代码更紧凑,但在这种情况下值得吗?

恕我直言,如果输入数组的结构可以具有嵌套结构,则递归方法是有意义的:

[
'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
    ],
  ],
]

然后你应该为此实现一个递归函数。当您不需要实现事情时,请保持简单。

它可以更短,尽管我通常这样做而不递归,因为它与深度无关。 您已经掌握了使用参考文献来做到这一点。请参阅如何按键名称/路径访问和操作多维数组?:

function toJsonStr($array, &$result=array()) {
    foreach($array as $key => $value) {
        $path = explode('/', $key);
        $temp =& $result;    
        foreach($path as $key) {
            $temp =& $temp[$key];
        }
        $temp = $value;
    }
    $result = json_encode($result);
}
toJsonStr($array, $result);

相关内容

最新更新