エントリー

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]えええええ

ツリー生成手順は、以下の書籍を参考にしています。プログラミングをはじめた頃によく読んでいた本なので、久しぶりに読んで懐かしい…。

CGI&SSIを使うとホームページ作成にこんなに差が出る

ページ移動

ユーティリティ

カテゴリー

検索

エントリー検索フォーム
キーワード

過去ログ

過去ログ表示フォーム
キーワード

Feed