この記事は、再帰を使用する場合と再帰を使用しない場合の PHP での無限分類の実装を 2 つの状況に分けて紹介しています。興味のある方は、
#PHP を長くやっている方は参照してください。バックエンド管理システムの不可欠なアプリケーション モジュールは列の分類であることがわかりました。一般に、列は無限のレベルに作成する必要があります。これは、理論的には各列にサブ列を追加できることを意味します。私の意見では、この状況の処理は全体としてはそれほど複雑ではありません。比較的難しい点は無限列のクエリだけです。 この状況について簡単に説明します。この種の無限列をクエリするには、一般に 2 つの方法があります。1 つはスタック メカニズムを使用する方法で、もう 1 つは再帰関数を使用する方法です。再帰関数の実装メカニズムもスタックの助けを借りて実装されます)。以下では、これら 2 つの方法を個別に紹介します。再帰関数の実装方法
上で述べたように、再帰関数もスタック機構を利用して実装されますが、その基礎となるスタック処理はプログラマにとっては困難です。透過的であり、プログラマはアプリケーションの実装ロジックのみを気にする必要があります。したがって、上記の問題に対処するには再帰を使用する方が理解しやすく、コードも比較的簡潔になります。 再帰関数を使用しているため、名前からカスタム関数を使用する必要があることがわかります。まず実装のアイデアについて簡単に説明し、具体的な詳細をコードに反映させていきます。 各レイヤーの関数の主な仕事は、親 ID が現在の ID である列を検索することです。それを見つけた後、独自の関数を再度呼び出し、見つかった列の ID を次のレイヤーの親 ID として使用します。 フローチャートは次のとおりです 図 1上記の説明を理解できるかわかりません。問題はありません。コードを直接見てみましょう。<?php /** * 个人博客:迹忆博客 * 博客地址:www.onmpw.com * 递归实现无限极分类 */ $channels = array( array('id'=>1,'name'=>"衣服",'parId'=>0), array('id'=>2,'name'=>"书籍",'parId'=>0), array('id'=>3,'name'=>"T恤",'parId'=>1), array('id'=>4,'name'=>"裤子",'parId'=>1), array('id'=>5,'name'=>"鞋子",'parId'=>1), array('id'=>6,'name'=>"皮鞋",'parId'=>5), array('id'=>7,'name'=>"运动鞋",'parId'=>5), array('id'=>8,'name'=>"耐克",'parId'=>7), array('id'=>9,'name'=>"耐克",'parId'=>3), array('id'=>10,'name'=>"鸿星尔克",'parId'=>7), array('id'=>11,'name'=>"小说",'parId'=>2), array('id'=>12,'name'=>"科幻小说",'parId'=>11), array('id'=>13,'name'=>"古典名著",'parId'=>11), array('id'=>14,'name'=>"文学",'parId'=>2), array('id'=>15,'name'=>"四书五经",'parId'=>14) ); $html = array(); /** * 递归查找父id为$parid的结点 * @param array $html 按照父-》子的结构存放查找出来的结点 * @param int $parid 指定的父id * @param array $channels 数据数组 * @param int $dep 遍历的深度,初始化为1 */ function getChild(&$html,$parid,$channels,$dep){ /* * 遍历数据,查找parId为参数$parid指定的id */ for($i = 0;$i<count($channels);$i++){ if($channels[$i]['parId'] == $parid){ $html[] = array('id'=>$channels[$i]['id'],'name'=>$channels[$i]['name'],'dep'=>$dep); getChild($html,$channels[$i]['id'],$channels,$dep+1); } } } getChild($html,0,$channels,1); ?>
非再帰的、つまり、スタック メカニズムを使用して無限列のクエリを実現します
上記では、無限列のクエリを実行するための再帰の使用について簡単に紹介しました。以下では、非再帰的メソッドを簡単に紹介しましょう。再帰関数は使用していませんが、無限カラムの構造ページを考慮すると、この問題を解決するには再帰実装メカニズム、つまりスタックメカニズムを参照する必要があります。 私が学校にいたとき、先生は、実際、スタックの中心的なメカニズムは、先入れ、後出しという 4 つの単語だけであると言いました。 ここではスタックの仕組みについてはあまり説明しませんが、主にスタックを使用して無制限の列クエリを実装する方法について説明します。 1. まず先頭の列をスタックにプッシュします。2. 先頭の要素をスタックからポップします。3. ポップされた要素を配列に格納し、その深さをマークします。 (深さは親列の深さに 1 を加えます) 4. ポップされた要素を親列として取得し、そのサブ列を検索します 5 見つかったサブ列を入力します。 -列をスタックに挿入し、ステップ 26 を繰り返します。スタックが空であると判断された場合、プロセスは終了します。上記のステップを変換することで、これらのステップを PHP コードに変換できます。コア コードは次のとおりです<?php /** * 个人博客:迹忆博客 * 博客地址:www.onmpw.com *使用非递归,即使用栈的方式实现栏目的无限极分类查询 */ $channels = array( array('id'=>1,'name'=>"衣服",'parId'=>0), array('id'=>2,'name'=>"书籍",'parId'=>0), array('id'=>3,'name'=>"T恤",'parId'=>1), array('id'=>4,'name'=>"裤子",'parId'=>1), array('id'=>5,'name'=>"鞋子",'parId'=>1), array('id'=>6,'name'=>"皮鞋",'parId'=>5), array('id'=>7,'name'=>"运动鞋",'parId'=>5), array('id'=>8,'name'=>"耐克",'parId'=>7), array('id'=>9,'name'=>"耐克",'parId'=>3), array('id'=>10,'name'=>"鸿星尔克",'parId'=>7), array('id'=>11,'name'=>"小说",'parId'=>2), array('id'=>12,'name'=>"科幻小说",'parId'=>11), array('id'=>13,'name'=>"古典名著",'parId'=>11), array('id'=>14,'name'=>"文学",'parId'=>2), array('id'=>15,'name'=>"四书五经",'parId'=>14) ); $stack = array(); //定义一个空栈 $html = array(); //用来保存各个栏目之间的关系以及该栏目的深度 /* * 自定义入栈函数 */ function pushStack(&$stack,$channel,$dep){ array_push($stack, array('channel'=>$channel,'dep'=>$dep)); } /* * 自定义出栈函数 */ function popStack(&$stack){ return array_pop($stack); } /* * 首先将顶级栏目压入栈中 */ foreach($channels as $key=>$val){ if($val['parId'] == 0) pushStack($stack,$val,0); } /* * 将栈中的元素出栈,查找其子栏目 */ do{ $par = popStack($stack); //将栈顶元素出栈 /* * 查找以此栏目为父级栏目的id,将这些栏目入栈 */ for($i=0;$i<count($channels);$i++){ if($channels[$i]['parId'] == $par['channel']['id']){ pushStack($stack,$channels[$i],$par['dep']+1); } } /* * 将出栈的栏目以及该栏目的深度保存到数组中 */ $html[] = array('id'=>$par['channel']['id'],'name'=>$par['channel']['name'],'dep'=>$par['dep']); }while(count($stack)>0);
#
以上がPHPを使用して無制限の分類クエリを実装するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。