PHP を学習している多くの友人が、スキルを向上させる方法としてオンライン ショッピング モールを構築しようとすると思います。商品分類や商品名などのさまざまな操作に慣れてきたら、無制限に分類リストを作成してみましょう。
無限分類とは何ですか?
無限レベル分類とは、部門組織、記事分類、主題分類などによく使われる分類手法で、単純に分類と理解することができます。実際、よく考えてみると、服は紳士服と婦人服、トップスとパンツに分けることができ、また年齢層によっても分類することができます。分類はどこにでもあり、分類は「無限」であるように見えます。無限分類の必要性についてはここでは話しません。
無限分類の原理の紹介
無限分類というと「高度」に見えるかもしれませんが、実際には原理は非常にシンプルです。無限分類はコードの創意工夫を必要とするだけでなく、データベース設計の合理性にも依存します。無限の分類を満たすには、データベースに id と pid という 2 つの必須フィールドが必要です。 id はそれ自体を識別するために使用され、pid は親 ID を示すために使用されます。言い換えれば、各分類レコードはそれ自体を説明するだけでなく、最も密接に関係している別の ID も説明します。複雑そうに見えた問題も、ちょっとした工夫で解決しました。
それでは早速、この記事の例を紹介していきます。
熱心な海賊ファンとして、この記事では「ワンピース」のキャラクター編成を例に挙げていきます。
データベースの準備:
テーブル onepiece の作成:
<span>create</span><span>table</span><span> onepiece( id </span><span>int</span><span> auto_increment, pid </span><span>int</span><span>not</span><span>null</span><span>, name </span><span>varchar</span>(<span>225</span>) <span>not</span><span>null</span><span>, </span><span>primary</span><span>key</span><span>(id) );</span>
テスト データの挿入:
<span>insert</span> onepiece <span>values</span><span> (</span><span>1</span>,<span>0</span>,<span>'</span><span>海军</span><span>'</span><span>), (</span><span>2</span>,<span>0</span>,<span>'</span><span>海贼</span><span>'</span><span>), (</span><span>3</span>,<span>0</span>,<span>'</span><span>革命军</span><span>'</span><span>), (</span><span>4</span>,<span>1</span>,<span>'</span><span>青雉</span><span>'</span><span>), (</span><span>5</span>,<span>1</span>,<span>'</span><span>赤犬</span><span>'</span><span>), (</span><span>6</span>,<span>1</span>,<span>'</span><span>黄猿</span><span>'</span><span>), (</span><span>7</span>,<span>2</span>,<span>'</span><span>四皇</span><span>'</span><span>), (</span><span>8</span>,<span>2</span>,<span>'</span><span>七武海</span><span>'</span><span>), (</span><span>9</span>,<span>2</span>,<span>'</span><span>草帽海贼团</span><span>'</span><span>), (</span><span>10</span>,<span>9</span>,<span>'</span><span>索隆</span><span>'</span><span>), (</span><span>11</span>,<span>7</span>,<span>'</span><span>香克斯</span><span>'</span><span>), (</span><span>12</span>,<span>8</span>,<span>'</span><span>多弗朗明哥</span><span>'</span><span>), (</span><span>13</span>,<span>8</span>,<span>'</span><span>克洛克达尔</span><span>'</span>);
これが人気科学における ワンピース の設定です。世界は 3 つの陣営に分かれています: 海軍、海賊、そして革命軍。海軍には青キジ、赤犬、黄猿という大将がいます。海賊には四皇、七武海、麦わらの一味がいます。四皇にはシャンクス、七武海にはドフラミンゴやクロコダイル、麦わらの一味にはゾロがいます。 (宣伝: ワンピースは本当に良いです)。
最終目標:
今日私たちが作っているのは、2 つの形式の無限分類フォームです。1 つはドロップダウン リスト タイプ、もう 1 つはナビゲーション リンク タイプです。レンダリングは直接表示されます:
ドロップダウン リスト スタイルナビゲーション リンク スタイル
コード例:
Unlimited クラスをカプセル化し、diaplayList() を呼び出してドロップダウン リスト フォームを表示し、diaplayLink を呼び出してナビゲーションリンクカテゴリを表示します。カテゴリを追加 (addNodes()) および削除 (deleteNodes) することもできます。
<?<span>php </span><span>class</span><span> Unlimited{ </span><span>protected</span><span>$mysqli</span><span>; </span><span>public</span><span>function</span> __construct(<span>$config</span><span>){ </span><span>$this</span>->mysqli=<span>new</span> mysqli(<span>$config</span>['host'],<span>$config</span>['user'],<span>$config</span>['pwd'<span>]); </span><span>$this</span>->mysqli->select_db(<span>$config</span>['db'<span>]); </span><span>$this</span>->mysqli->set_charset('utf8'<span>); </span><span>if</span> (<span>$this</span>->mysqli-><span>connect_errno) { </span><span>echo</span><span>$this</span>->mysqli-><span>connect_error; } } </span><span>private</span><span>function</span> getList(<span>$pid</span>=0,&<span>$result</span>=<span>array</span>(),<span>$spac</span>=0<span>){ </span><span>$spac</span>=<span>$spac</span>+2<span>; </span><span>$sql</span>="select * from onepiece where pid={<span>$pid</span>}"<span>; </span><span>$rs</span>=<span>$this</span>->mysqli->query(<span>$sql</span><span>); </span><span>while</span>(<span>$row</span>=<span>$rs</span>-><span>fetch_assoc()) { </span><span>$row</span>['name']=<span>str_repeat</span>('  ',<span>$spac</span>).<span>$row</span>['name'<span>]; </span><span>$result</span>[]=<span>$row</span><span>; </span><span>$this</span>->getList(<span>$row</span>['id'],<span>$result</span>,<span>$spac</span><span>); } </span><span>return</span><span>$result</span><span>; } </span><span>/*</span><span>* * 展现下拉列表式分类 * @return [type] </span><span>*/</span><span>public</span><span>function</span><span> displayList(){ </span><span>$rs</span>=<span>$this</span>-><span>getList(); </span><span>$str</span>="<select name='cate'>"<span>; </span><span>foreach</span> (<span>$rs</span><span>as</span><span>$key</span> => <span>$val</span><span>) { </span><span>$str</span>.="<option >{<span>$val</span>['name']}</option>"<span>; } </span><span>$str</span>.="</select>"<span>; </span><span>return</span><span>$str</span><span>; } </span><span>private</span><span>function</span> getLink(<span>$cid</span>,&<span>$result</span>=<span>array</span><span>()){ </span><span>$sql</span>="select * from onepiece where id={<span>$cid</span>}"<span>; </span><span>$rs</span>=<span>$this</span>->mysqli->query(<span>$sql</span><span>); </span><span>if</span>(<span>$row</span>=<span>$rs</span>-><span>fetch_assoc()){ </span><span>$result</span>[]=<span>$row</span><span>; </span><span>$this</span>->getLink(<span>$row</span>['pid'],<span>$result</span><span>); } </span><span>return</span><span>array_reverse</span>(<span>$result</span><span>); } </span><span>/*</span><span>* * 展现导航Link * @param [type] $cid [description] * @return [type] [description] </span><span>*/</span><span>public</span><span>function</span> displayLink(<span>$cid</span><span>){ </span><span>$rs</span>=<span>$this</span>->getLink(<span>$cid</span><span>); </span><span>$str</span>=''<span>; </span><span>foreach</span> (<span>$rs</span><span>as</span><span>$val</span><span>) { </span><span>$str</span>.="<a href=''>{<span>$val</span>['name']}</a>>"<span>; } </span><span>return</span><span>$str</span><span>; } </span><span>/*</span><span>* * 增加分类 * @param [type] $pid 父类id * @param [type] $name 本类名 </span><span>*/</span><span>public</span><span>function</span> addNodes(<span>$pid</span>,<span>$name</span><span>){ </span><span>$sql</span>="insert into onepiece values('',{<span>$pid</span>},'".<span>$name</span>."')"<span>; </span><span>if</span>(<span>$this</span>->mysqli->query(<span>$sql</span><span>)){ </span><span>return</span><span>true</span><span>; } } </span><span>/*</span><span>* * 删除分类 * @param [type] $id 本类id * @return [type] </span><span>*/</span><span>public</span><span>function</span> deleteNodes(<span>$id</span><span>){ </span><span>$sql</span>="select * from onepiece where pid ={<span>$id</span>}"<span>; </span><span>$rs</span>=<span>$this</span>->mysqli->query(<span>$sql</span><span>); </span><span>if</span>(<span>$row</span>=<span>$rs</span>-><span>fetch_assoc()){ </span><span>$mes</span>="还有子元素,请勿删除"<span>; }</span><span>else</span><span>{ </span><span>$sql</span>="delete from onepiece where id={<span>$id</span>}"<span>; </span><span>if</span>(<span>$this</span>->mysqli->query(<span>$sql</span><span>)){ </span><span>$mes</span>="删除成功"<span>; } } </span><span>return</span><span>$mes</span><span>; } }</span>
クラス内の関数は主に再帰関数の手法を採用していますが、再帰関数を深く理解していれば、残りは理解できます。再帰関数を実装する 3 つの方法については、後のセクションで詳しく説明します。
上記は、内容の側面も含めて、PHP での再帰関数の使用を紹介し、PHP チュートリアルに興味のある友人に役立つことを願っています。