• 締切済み

phpでツリー表示

表題の通り、phpをもちいてツリー表示をしたいと思っています。 そこで、下記のコードの実行結果は以下の通りなのですが、 【このように実行結果を変えたい】のように表示したいと考えています。 どのようにコードを書きかえれば、実行できるでしょうか? 【コード】 <?php function put_tree($no, $line, $broths, $childs, $texts) { echo '<span class="line">' . $line . '</span>'; echo '▼[' . $no . ']' . $texts[$no] . '<br>'; $line = preg_replace('/├$/', '│', $line); $line = preg_replace('/└$/', ' ', $line); $no = isset($childs[$no]) ? $childs[$no] : 0; while ($no > 0) { $tail = $broths[$no] ? '├' : '└'; put_tree($no, $line . $tail, $broths, $childs, $texts); $no = $broths[$no]; } } ?> <html> <head> <title>ツリー表示</title> <style> .line { font-family: "MS ゴシック", monospace; } </style> </head> <body> <?php $logs = array( array(1, 0, 'あああああ'), //記事番号・親記事番号・記事内容 array(2, 1, 'いいいいい'), array(3, 1, 'ううううう'), array(4, 2, 'えええええ'), array(5, 3, 'おおおおお'), array(6, 3, 'かかかかか'), array(7, 0, 'ききききき'), array(8, 6, 'くくくくく'), array(9, 8, 'けけけけけ'), array(10, 7, 'こここここ') ); $roots = array(); $broths = array(); $childs = array(); $texts = array(); foreach ($logs as $log) { list($no, $pno, $text) = $log; if ($pno == 0) { $roots[] = $no; } else { $broths[$no] = isset($childs[$pno]) ? $childs[$pno] : 0; $childs[$pno] = $no; } $texts[$no] = $text; } rsort($roots); foreach ($roots as $root) { put_tree($root, '', $broths, $childs, $texts); } ?> </body> </html> 【実行結果】 ▼[7]ききききき └▼[10]こここここ ▼[1]あああああ ├▼[3]ううううう │├▼[6]かかかかか ││└▼[8]くくくくく ││ └▼[9]けけけけけ │└▼[5]おおおおお └▼[2]いいいいい  └▼[4]えええええ 【このように実行結果を変えたい】 ▼[1]あああああ ├▼[3]ううううう │├▼[6]かかかかか ││└▼[8]くくくくく ││ └▼[9]けけけけけ │└▼[5]おおおおお └▼[2]いいいいい  └▼[4]えええええ ▼[7]ききききき └▼[10]こここここ

みんなの回答

  • agunuz
  • ベストアンサー率65% (288/438)
回答No.2

「こうしたい」と例示された内容では、どの順に処理するのかが読み取れません。親記事は古い順、レスは新しい順ということでしょうか? (例) <?php $logs = array( array(1, 0, 'あああああ'), //記事番号・親記事番号・記事内容 array(2, 1, 'いいいいい'), array(3, 1, 'ううううう'), array(4, 2, 'えええええ'), array(5, 3, 'おおおおお'), array(6, 3, 'かかかかか'), array(7, 0, 'ききききき'), array(8, 6, 'くくくくく'), array(9, 8, 'けけけけけ'), array(10, 7, 'こここここ') ); print '親記事、レスとも古い順<br>'; foreach ($logs as list($no, $oya, $kiji)) { if ($oya > 0) { continue; } print $no . $kiji . '<br>'; listchild($logs, $no); } function listchild($logs, $parent) { $ct = 0; foreach ($logs as list($no, $oya, $kiji)) { if ($oya !== $parent ) { continue; } if ($ct++ == 0) { print '<ul>'; } print '<li>' . $no . $kiji . '</li>'; listchild($logs, $no); } if ($ct > 0) { print '</ul>'; } } print '<hr>'; print '親記事は古い順、レスは新しい順<br>'; // おそらくはこちらですかね? foreach ($logs as list($no, $oya, $kiji)) { if ($oya > 0) { continue; } print $no . $kiji . '<br>'; listchilds($logs, $no); } function listchilds($logs, $parent) { $ct = 0; for ($i = count($logs) - 1; $i >= 0; $i--) { list($no, $oya, $kiji) = $logs[$i]; if ($oya !== $parent ) { continue; } if ($ct++ == 0) { print '<ul>'; } print '<li>' . $no . $kiji . '</li>'; listchilds($logs, $no); } if ($ct > 0) { print '</ul>'; } }

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

どういうコンセプトか分りませんが >rsort($roots); でわざわざ順番を逆順にしてる個所をやめれば済む話では?

関連するQ&A