teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

chousei

2021/07/15 04:19

投稿

yambejp
yambejp

スコア117912

answer CHANGED
@@ -14,14 +14,12 @@
14
14
  ['id' => 8, 'parent' => 7],
15
15
  ];
16
16
  $result=array_map(function($x,$y){
17
- $x["index"]=0;
17
+ return array_merge($x,["index"=>0]);
18
- return $x;
19
18
  },$y=array_values(array_filter($arr,function($x){
20
19
  return is_null($x["parent"]);
21
20
  })),array_keys($y));
22
21
 
23
22
  $i=0;
24
-
25
23
  while(true){
26
24
  $indexs=array_map(function($x){
27
25
  return $x["id"];
@@ -30,8 +28,7 @@
30
28
  }));
31
29
  if(count($indexs)==0) break;
32
30
  $result=array_merge($result,array_map(function($x) use($i){
33
- $x["index"]=$i+1;
31
+ return array_merge($x,["index"=>$i+1]);
34
- return $x;
35
32
  },array_filter($arr,function($x) use($indexs){
36
33
  return in_array($x["parent"],$indexs);
37
34
  })));

1

調整

2021/07/15 04:19

投稿

yambejp
yambejp

スコア117912

answer CHANGED
@@ -1,2 +1,43 @@
1
1
  データが膨大ならSQLなどで対応するのが現実的です。
2
- いわゆる入れ子集合モデルというアプローチになります
2
+ いわゆる入れ子集合モデルというアプローチになります
3
+
4
+ # 参考
5
+ ```PHP
6
+ $arr=[
7
+ ['id' => 1, 'parent' => null],
8
+ ['id' => 2, 'parent' => 1],
9
+ ['id' => 3, 'parent' => 2],
10
+ ['id' => 4, 'parent' => null],
11
+ ['id' => 5, 'parent' => 4],
12
+ ['id' => 6, 'parent' => 5],
13
+ ['id' => 7, 'parent' => 5],
14
+ ['id' => 8, 'parent' => 7],
15
+ ];
16
+ $result=array_map(function($x,$y){
17
+ $x["index"]=0;
18
+ return $x;
19
+ },$y=array_values(array_filter($arr,function($x){
20
+ return is_null($x["parent"]);
21
+ })),array_keys($y));
22
+
23
+ $i=0;
24
+
25
+ while(true){
26
+ $indexs=array_map(function($x){
27
+ return $x["id"];
28
+ },array_filter($result,function($x) use($i){
29
+ return $x["index"]==$i;
30
+ }));
31
+ if(count($indexs)==0) break;
32
+ $result=array_merge($result,array_map(function($x) use($i){
33
+ $x["index"]=$i+1;
34
+ return $x;
35
+ },array_filter($arr,function($x) use($indexs){
36
+ return in_array($x["parent"],$indexs);
37
+ })));
38
+ $i++;
39
+ }
40
+ usort($result,function($x,$y){return $x["id"]-$y["id"];});
41
+ print_r($result);
42
+
43
+ ```