gpt4 book ai didi

php - 将嵌套数组编码为没有数组索引的正确 json

转载 作者:可可西里 更新时间:2023-11-01 00:15:35 29 4
gpt4 key购买 nike

我有一个示例 2d $tasks 数组,它描述了一个嵌套结构:

Array
(
[14] => Array
(
[Id] => 14
[parentId] => null
[Name] => T1
)

[40] => Array
(
[Id] => 40
[parentId] => null
[Name] => T5
)

[41] => Array
(
[Id] => 41
[parentId] => null
[Name] => T4
)

[22] => Array
(
[Id] => 22
[parentId] => 14
[Name] => T2
)

[43] => Array
(
[Id] => 43
[parentId] => 22
[Name] => T2 child
)

[42] => Array
(
[Id] => 42
[parentId] => 14
[Name] => T3
)

)

我使用下面的代码将其转换为适当的树结构:

$sortedArray = array();
// get first level
foreach($tasks as $k => $v){
if($v['parentId'] == 'null'){
$sortedArray[$k] = $v;
unset($tasks[$k]);
}
}
// sort parents
asort($sortedArray);

function getChildren(array & $a1, array & $a2){
foreach($a1 as $k => $v){
findChildren($v, $a2, $k);
}
}

function findChildren($rec1, array & $a2, $key){

foreach($a2 as $k => $v){
if($rec1['parentId'] == $v['Id']){
$a2[$k]['children'][$rec1['Id']] = $rec1;
unset($tasks[$key]);
} else {
if (isset($v['children'])){
findChildren($rec1, $a2[$k]['children'], $key);
}
}
}
}

findChildren($tasks, $sortedArray);

运行此代码后输出 $sortedArray 如下所示:

Array
(
[14] => Array
(
[Id] => 14
[parentId] => null
[Name] => T1
[children] => Array
(
[22] => Array
(
[Id] => 22
[parentId] => 14
[Name] => T2
[children] => Array
(
[43] => Array
(
[Id] => 43
[parentId] => 22
[Name] => T2 child
)

)

)

[42] => Array
(
[Id] => 42
[parentId] => 14
[Name] => T3
)

)

)

[40] => Array
(
[Id] => 40
[parentId] => null
[Name] => T5
)

[41] => Array
(
[Id] => 41
[parentId] => null
[Name] => T4
)

)

问题是,在当前状态下对该输出数组调用 json_encode 之后,我得到:

{"14":{"Id":"14","parentId":"null"...

所以所有嵌套数组都插入了它们的索引。我知道我可以使用 array_values 修复第一层。但是是否有任何简单的方法可以对所有级别执行此操作?没有它,我最终得到的“ child ”不是数组而是对象,这让我不满意。

最佳答案

您的帖子中没有代码,但是 $tasks 是作为关联数组创建的。在您的示例中,您还像关联数组一样遍历 $tasks:

foreach($tasks as $k => $v){
...
}

您需要像使用数字数组一样将子项添加到 $tasks;区别在于:

//associative array
$test = array();
$test["43"] = "hello";
$test["40"] = "hello1";
$test["23"] = "hello2";
print_r($test);

//numeric array
$testb = array();
$testb[] = "hello";
$testb[] = "hello1";
$testb[] = "hello2";
print_r($testb);

实例:http://codepad.org/tsOhX88h

对于数字数组,您引用的顶级索引(例如 14)是问题 {"14":{"Id":"14","parentId":"null".. . 不再存在。

作为简单的最后一步,使用此代码将关联数组中的项目推送到新的数值数组:

$finalArray = array();
foreach ($sortedArray as $key=>$val ){
$finalArray[] = $sortedArray[$key];
}
print_r($finalArray);

实例:http://codepad.org/uSGSr1DC

或者您可以使用 array_values 一次性完成:

$finalArray = array();
$finalArray = array_values($sortedArray);
print_r($finalArray);

实例:http://codepad.org/D7uBSRr8

关于php - 将嵌套数组编码为没有数组索引的正确 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12047033/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com