- 締切済み
再帰呼び出しについて
id | name | suuti | parent -- +------+--------------- 1 | root | 1 | 0 2 | aaa | 2 | 1 3 | bbb | 3 | 7 4 | ccc | 4 | 5 5 | ddd | 5 | 2 6 | eee | 6 | 2 7 | fff | 7 | 6 8 | ggg | 8 | 3 9 | hhh | 9 | 6 カラムparentはカラムidの子要素であることをあらわしております。 再帰処理により、まず rootはidが1,子供であるparentが1であるものはあるか? id2がparent1であるため、子になる。 次にparentが2のものはあるか? id5,6がparent2になるため子になる。 ここで2つのidが子になるため、分岐する。 この場合は若いid5のほうを見て、parentが5のものはいるか。 id4がparentが5になるので子になる。 次にparentが4のものはいるか。 次はいないので、id4は木構造で言う葉(末端)になる。 末端まで行き着いたら、id4である親にid5のsuuti5を加え、id4のsuuti4+5=9になる。 次に分岐したときの後のid6の子はいるか? id7が子なる。 というように、この値を親に足しこみ、いろいろな場所からidを与えてあげるだけでその子の値が加えられた親の値が取得できるようにしたいのですが、 プログラムが思いつきません。 どなたかご教授くださいますよう、お願いいたします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- little-m
- ベストアンサー率44% (45/102)
以下のような感じのロジックでできるのでは? (この場でババッと記述したのみで、全く動かしていないのでご自身でデバッグしてください) $dats = array(....); // データ配列 $myid = 1; // 最初自ID $pid = 0; // 最初の親ID $stac = 0; // 無限ループ防止用の階層カウンタ calc($dats, $myid, $pid, $stac) function calc( $dats, $myid, $pid, &$stac) { $stac ++; if ($stac >= 10) { print("stac over"); exit; } $last = TRUE; foreach ($dats as $dat) { if ($dat['parent'] == $id) { $last = FALSE; calc($dats, $dat['id'], $myid, $stac) } } if ($last) { $sum = $myid + $pid; print("last : myid=$mypd / pid=$pid / sum=$sum<br>\n"); } $stac --; }
お礼
little-m様、ご回答ありがとうございます。こちらのロジックを参考にさせていただきます。ありがとうございました!