phpでの再帰関数を利用したツリー表示

このQ&Aのポイント
  • phpで再帰関数を利用してツリー表示を行いたいが、再帰呼び出しが100回を超えるとエラーが発生する
  • 再帰呼び出しの回数を増やすための方法を知りたい
  • ツリー表示を行うためのコードの一部を提供する
回答を見る
  • ベストアンサー

phpでの再帰関数を利用したツリー表示

・やりたいこと 一つのIDの下にいくつの階層があるかカウントする。 コードは既にできているのですが、いざ運用しようとしたときに Fatal error: Maximum function nesting level of '100' reached, > aborting! と出てしまいました。 色々調べた結果、phpでは100を超える再帰呼び出しはできないというのを見つけました。 本当にできないのでしょうか?他にやる方法はあるのでしょうか? php側の設定で何とかなるもんなんでしょうか? ~~~以下DB構造~~~~~~~~~~~~~~~~~~~~~~ id(int) | lid(int) | rid(int) ~~~以下コード~~~~~~~~~~~~~~~~~~~~~~ Class tree_show { var $i_ = 0; var $ar_ = array(); function findid2($colm) { foreach($colm as $value){ $value = $this->findid($value); } } function findid($id) { if(!empty($id)) { $rs = mysql_query("select * from tree_all where id='".$id."'"); $row = mysql_fetch_array($rs); $dim = $row['id']; $this->i_++; $this->addarray($dim); $arr = array($row['lid'],$row['rid']); $this->findid2($arr); } } function printid() { return $this->i_; } function addarray($dim) { array_push($this->ar_,$dim); } function printarray() { return $this->ar_; } } $id= $_REQUEST[id]; $db = mysql_connect(); $sql = "select * from tree_all where id = '".$id."'"; $rs = mysql_query($sql,$db); $row = mysql_fetch_array($rs); $class = New tree_show(); $class->findid($row['lid']); echo $left = $class->printid(); print_r($class->printarray()); echo "<br>"; $class2 = New tree_show(); $class2->findid($row['rid']); echo $right = $class2->printid(); echo "<br>"; print_r($class2->printarray());

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

初めて知った現象ですが、xdebug.max_nesting_levelなんて設定があるみたいですね。 この辺の設定を変えてみてはいかがでしょうか?

AJKILLER
質問者

お礼

mizuno3様 御回答ありがとうございます。 早速試した結果うまくいきました。 xdebugでひっかかっていたのはまったく気づきませんでした。

関連するQ&A

  • PHPでの再帰を用いたツリー構造について

    PHPを勉強中の初心者です。PHPで、ツリー構造を再帰関数を用いて実装するプログラムを作成し、そのツリーを表示しようとているのですが、どうもよくわかりません。 このプログラムの挙動としては、以下でクリエイトしたTreeオブジェクトを、preorder(トップダウン、左側から)で出力させるもので、期待値は以下のとおりです。 (期待値) preorder: 1 2 4 5 3 6 7 (クリエイトされたオブジェクト) $myTree = new Tree(1, new Tree(2, new Tree(4), new Tree(5)), new Tree(3, new Tree(6), new Tree(7))); =========サンプルプログラム================================ #!/usr/bin/env php <?php class Tree { var $top; var $left; var $right;     #コンストラクタを定義はこれであっているでしょうか。 function Tree($top, $left, $right){ $this ->top = $top; $this ->left = $left; $this ->right= $right; }; function preorder( ){         #preorder() メソッドを実装方法がよくわかりません。 } } $myTree = new Tree(1, new Tree(2, new Tree(4), new Tree(5)), new Tree(3, new Tree(6), new Tree(7))); function printPreorder($tree) { echo "preorder:\n"; $tree->preorder(create_function('$v', 'echo "$v\n";')); } printPreorder($myTree); ?>

    • 締切済み
    • PHP
  • php5のコンストラクタをphp4仕様に変えたいです。

    今日からつかえるPHP5サンプル集を使ってphpの練習をしています。 この中にDBを使った掲示板のサンプルがあり、DBの出入力をクラスファイルで行っています。 そのphp5の__constract()を使っている部分を、php4に対応した形にしようとして躓いています。 以下、コードです。一部編集しています。 【Article.class.php】 class Article { //*この部分を追加 function Article() { $this->__construct(); }// function __construct(){ /* コンストラクタ */ } var $_id; …中略 function getId(){return $this->_id;} …中略 function setId($id){$this->_id=$id;} …中略 function getArticleInfo($cnt,$num){ $aryArt=array(); $db=DB::connect("mysql~"); $rs=$db->query("SELECT * FROM bbs_master WHERE parent=0 ORDER BY sdat DESC LIMIT ".$cnt.",".$num); while($row=$rs->fetchRow(DB_FETCHMODE_ASSOC)){ $objArt=new Article(); $objArt->setId($row['id']); …中略 //*これ以下を実行するとieで"ページを表示できません。"が出る $aryTmp=Article::getChildArticleInfo($objArt->getId()); $objArt->setChild($aryTmp); $aryArt[]=$objArt; } return $aryArt; } function getChildArticleInfo($id){ …各記事の子記事を抽出するプログラム } return $aryArt; } } PEARの読み込みやDB接続は成功しているのは確認済みです。 上記コード中の再帰的にArticle::getChildArticleInfo($objArt->getId());を呼び出しているところで実行できなくなるようです。 これをphp4でも動作するように変更できないでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 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]こここここ

    • 締切済み
    • PHP
  • こんにちは、PHP初心者です。

    こんにちは、PHP初心者です。 Smartyを利用してWebサイトを構築中です。 Smarty.classの派生クラスを作成し、コンストラクタ内でDB接続オブジェクトをprivateプロパティ($_db)に設定しているのですが,query文のところでエラーSELECT * FROM books [nativecode=1046 ** No database selected]となります。ためしにコンストラクタ内でクエリを実行したところテーブルから値を取得できました。なぜコンストラクタ外に出るとエラーになるのかわかりません。どなたかご教示ください。どうぞよろしくお願いします。 下記ソースです。 =====派生クラス======================= <?php $user = "dbuser"; $pass = "dbpassword"; $name = "mobilephp"; $host = "localhost"; require_once("DB.php"); require_once("Smarty/libs/Smarty.class.php"); class MySmarty extends Smarty { private $_db; public function __construct() { $this->Smarty(); $this->template_dir="../templates"; $this->compile_dir="../templates_c"; $this->_db=DB::connect("mysql://$user:$pass@$host/$dbname"); } public function __destruct() { $this->_db->disconnect(); } public function get_db() {return $this->_db;} } ?> ======end===================================== ==========メインのPHP=================================== <?php require_once("../MySmarty.class.php"); $o_smarty=new MySmarty(); $db=$o_smarty->get_db(); $stt=$db->query("SELECT * FROM books");←ここでエラーになる $data=array(); while($row=$stt->fetchRow(DB_FETCHMODE_ASSOC)){ $data[]=array("isbn"=>$row['isbn'],"title"=>$row['title'], "publish"=>$row['publish'],"price"=>$row['price']); } $o_smarty->assign("data",$data); $o_smarty->display("structure.html"); ?>

    • ベストアンサー
    • PHP
  • php修正について

    下記のPHPを書いています。 表示したときに_(/)されて文字と日付が出ないといけないのですが? 正しい表示は 強豪ぞろいの天皇賞ー武は1枠で波乱倍増??? (10/27)です。 Mysqlはデータは入っています。 教えてください。 <?php do { ?> <BLINK><IMG src="list.gif" width="13" height="13" border="0"></BLINK><FONT color="#cc00cc"><a href="blog_02.php?id=<?php echo $row_rs_blog_02['id']; ?>"><?php echo mb_substr($row_rs_blog_02['title'],0,30); ?> <?php if (mb_strlen($row_rs_blog['title']) >= '30') { echo('…'); } ?> </a><?php echo "("; echo substr($row_rs_blog_02['date'], 4,2); echo "/"; echo substr($row_rs_blog_02['date'], 6,2); echo ")"; ?></FONT><br> <br> <?php } while ($row_rs_blog_02 = mysql_fetch_assoc($rs_blog)); ?>

    • ベストアンサー
    • PHP
  • PHPとmysqlに関して

    while($row3 = mysql_fetch_array($res3)){ $r3 = $row3['name']; $d3 = $row3['day']; while($row = mysql_fetch_array($res)){ $r = $row['name']; if($days==$d3 and $r==$r3){ echo '<a href="tops2.php?id='.$row['id'].'"><div class="aaa"><div style="padding-top:10px">'.$row['name'].'<br><font color="red">出勤中</font></div></div></a>'; }else{ echo '<a href="tops2.php?id='.$row['id'].'"><div class="aaa"><div style="padding-top:15px">'.$row['name'].'</div></div></a>'; } }} 簡単に説明すると、テーブルAのnameとテーブルBのnameが合致したら出勤中と表示させたいのですが、何故か合致したデータの一部しか出勤中と出ません。 なにがおかしいですか??

    • ベストアンサー
    • PHP
  • PHPのmysql_queryの変数について

    PHPのmysql_queryの変数について 全くの初心者です。 ログイン情報のチェックに使うクラスを調べているのですが、 mysql_queryの結果が表示されなく、原因が分かりません。 ご存知の方がおられましたら、ご教授頂けませんでしょうか。 よろしくお願い致します。 以下が全体のコードです。(1)(2)の問題があります。 <?php require_once "BaseDB.class.php"; // ログインをするクラス class Settings extends BaseDB { // ユーザ認証 public function isValidUser( $id, $pass ) { //var $qstring; // SQL文 //var $qresult; // mysql_query関数の結果 //var $fresult; // mysql_fetch_arrayの結果 $this->errors = 0; // MySQLにデータがあるか調べる $qstring = "select passwd from b_settings where username='$id'"; //クエリを実行 echo "setting class:<br>"; echo "qstring:<br>"; echo "$qstring<br />";//select passwd from b_settings where username=unknown $qresult = mysql_query($qstring); echo "qresult:<br>"; ////// (1)ココが表示されない。 echo "$qresult<br>"; if(!$qresult) { echo $qresult; $this->errorm = "ユーザ名が違います。table Error";////////// (2)このエラーが出てしまいます。 $this->errors++; return false; } if(!$fresult = mysql_fetch_array($qresult)) { $this->errorm = "ユーザ名が違います。"; $this->errors++; return false; } //echo "$pass /" . $fresult['passwd'] . "<br>"; if( $pass == $fresult['passwd'] ) { //echo "$pass /" . $fresult['passwd'] . "<br>"; return true; } else { $this->errorm = "パスワードが違います。"; $this->errors++; return false; } }//関数終了 public function loadSettings( $id='' ) { $qstring = "select maintitle,subtitle,maxtopics," . "username,passwd,mailaddr from b_settings where id=1"; //クエリを実行 $qresult = mysql_query($qstring); if(!$qresult){ $this->errorm = "DB Error:[$qstring]"; $this->errors++; return false; } if(!$fresult = mysql_fetch_array($qresult)) { $this->errorm = "設定情報がありません。"; $this->errors++; return false; } $this->maintitle = $fresult['maintitle']; $this->subtitle = $fresult['subtitle']; $this->maxtopics = $fresult['maxtopics']; $this->username = $fresult['username']; $this->passwd = $fresult['passwd']; $this->mailaddr = $fresult['mailaddr']; return true; } public function saveSettings( $id='' ) { $qstring = "update b_settings set ". "maintitle = '$this->maintitle', ". "subtitle = '$this->subtitle', ". "maxtopics = '$this->maxtopics', ". "username = '$this->username', ". "passwd = '$this->passwd', ". "mailaddr = '$this->mailaddr' ". " where id=1"; //クエリを実行 $qresult = mysql_query($qstring); if(!$qresult){ $this->errorm = "DB Error:[$qstring]"; $this->errors++; return false; } return true; } // プロパティ参照 function __get( $property ) { return $this->$property; } // プロパティセット function __set( $property, $value ) { $this->$property = $value; } } //クラス終了 ?>

    • ベストアンサー
    • PHP
  • PHPエラーについて

    PHPで修正をしたら下記のエラーがでました。 Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in /usr/home/g105427/html/test/blog_special.php on line 199 ble border="0" cellpadding="3" cellspacing="0"> <?php $i = 0; do { $i = $i + 1; ?> <tr> <td><IMG src="image/list.gif" width="13" height="13" border="0"><font color="#FF8000"><a href="blog_02.php?id=<?php echo $row_rs_blog_02['id']; ?>"> <?php echo mb_substr($row_rs_blog_02['title'],0,50); ?> <?php if (mb_strlen($row_rs_blog_02['title']) >= '50') { echo('…'); } ?> </a> <?php echo "("; echo substr($row_rs_blog_02['date'], 4,2); echo "/"; echo substr($row_rs_blog_02['date'], 6,2); echo ")"; ?></font></td> </tr> <?php } while ($row_rs_blog_02 = mysql_fetch_assoc($rs_blog_02) and $i < 2); ?> </table> <BR> <BR> ちなみに199行目は ?php } while ($row_rs_blog_02 = mysql_fetch_assoc($rs_blog_02) and $i < 2); ?> になっています。 教えてください。 説明が悪くてすいません。

    • ベストアンサー
    • PHP
  • PHP array関数の[ ]内の値の表示

    mySQLのデータベースでテーブルを作成、af1~af5のカラムには、に下記のように数値が入っているものと入っていないもの(NULL)があります。 af1 ='10' af2 ='15' af3 ='' af4 ='20' af5 ='' 【作りたいPHP】 数字が入っているカラムがあれば、そのカラム番号(af1なら1、af2なら2)のうちもっとも若い番号1つだけ抽出(上記のカラムであれば3)し、全てのカラムが埋まっていれば0を返すPHPを組みたいと考えています。 <?php $a2 = array( 1=>$row_friend_name['af1'], 2=>$row_friend_name['af2'], 3=>$row_friend_name['af3'], 4=>$row_friend_name['af4'], 5=>$row_friend_name['af5'], ); $empty = array_filter($a2, function($i){return !$i;}); var_dump($empty); ?> 上記のPHPを組んだところ、var_dumpの答えが array(2) [3]=>NULL [5]=>NULL となります。 これを流用し、$emptyの中に[1]や[2]などの記号が入っているかどうかを見極めさせ、そこから1,2,3の数字(空きカラム)を導きだそうと考えました。 "array(2) [3]=>NULL [5]=>NULL"であれば、[1]や[2]を順番に探していき、最初に出てきた[3]を見つけて、'3'を表示させることになります。 *[3]* というワイルドカードを使ったlike検索のような形にしてみましたが、残念ながら検知してくれません。「見つからなかった」という意味の「0」が答えになっています。 マニュアルを何度も読見返したのですが、どうしても[3]=>NULL の3を抽出、表示する方法が分かりません。 大変お手数ですが対応方法についてご教授頂きたくお願い致します。 (なんとか自分で対応しようとしたのですが、納期と他の仕事の関係で、これ以上長時間勉強する時間がとれません。何卒宜しくお願い致します) 当方が作って検知出来なかったPHP <?php $a2 = array( 1=>$row_friend_name['af1'], 2=>$row_friend_name['af2'], 3=>$row_friend_name['af3'], 4=>$row_friend_name['af4'], 5=>$row_friend_name['af5'], ); $empty = array_filter($a2, function($i){return !$i;}); if (in_array('*[1]*', $empty, true)) { echo "'1\n"; } elseif (in_array('*[2]*', $empty, true)) { echo "2\n"; } elseif (in_array('*[3]*', $empty, true)) { echo "3\n"; } elseif (in_array('*[4]*', $empty, true)) { echo "4\n"; } elseif (in_array('*[5]*', $empty, true)) { echo "5\n"; } else { echo "0\n"; } ?>

    • ベストアンサー
    • PHP
  • php

    while($row = mysql_fetch_array($res,MYSQL_NUM)) { echo $row[1]."\n"; ここの文字コードを調べたいのですがどう書いたらいいでしょうか? 又参考になるサイトがありましたらお願いします

専門家に質問してみよう