$tasks
ネストされた構造を説明するサンプルの 2d配列があります。
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
。しかし、すべてのレベルでこれを行う簡単な方法はありますか? それがなければ、「子供」は配列ではなくオブジェクトになり、満足のいくものではありません。