2


1

この実用的なコードは、この問題に対する典型的な解決策のようです。

これはカテゴリとそのサブカテゴリを保持する多次元配列を取り(深さの深さの数に暗黙の制限はありません)、そこからHTML順不同リストを作成し、再帰関数の中からページにエコーアウトします。

サブレベルは、_category_list()_という名前の元のコールバック関数の内部から、各配列要素の 'children’キーの値をarray_walk()に再帰的に渡すことによって走査されます。

この出力方法をどのように変更して、すべてのHTMLコードが関数の外側でテンプレート内に存在するようにすることができますか?

これがコードの概要です。

この多次元配列は、多レベルのカテゴリツリーを保持しています。

HTMLで使用する重要なキーは 'category_id'、 'name'、および 'children’です。 他のキーは簡単にするために以下の配列から削除されていますが、それらが有用であればそれらは 'parent_id’と 'level'(レベル1から始まる)です。

'2'、 'name' => 'トップカテゴリー名'、 'children' => array(0 => array( 'category_id' => '188'、 'name' => 'カテゴリー名'、 'children' = > array(0 => array( 'category_id' => '159'、 'name' => 'カテゴリ名'、 'children' => array()、)、1 => array( 'category_id' => '160 '、' name '=>'カテゴリ名 '、' children '=> array()、)、2 => array(' category_id '=>' 166 '、' name '=>' Category Name '、' children ' => array()、)、)、)、1 => array( 'category_id' => '4'、 'name' => 'カテゴリ名'、 'children' => array(0 => array( 'category_id) '=>' 141 '、' name '=>'カテゴリ名 '、'子 '=> array()、)、1 => array(' category_id '=>' 142 '、' name '=>'カテゴリ名'、' children '=> array()、)、)、)、)、)

?

.

この次の関数はHTML出力の大部分を生成しますが、HTMLをそれ自体の内部にロックします。

ただし、関数から直接エコーするのではなく、デザイナーがカスタマイズしやすい方法でこのデータをビューテンプレートに戻す方法を探しています。

"; break;ケース 'name':echo" $ v "; break;ケース 'children':if(count($ v)> 0){echo" "; foreach($ v = $ k => $ v)array_walk ($ v、 'category_list'); echo "";} echo ""; break;}}

?

.

次のコードブロックは、現在のテンプレートhtml / phpで、array_walk()を介して配列の最初のレベルを走査し、上記の再帰関数を参照しています。 その後、関数自体が、1つ以上の子を持つより深いカテゴリの再帰と反復を処理します。 もちろん、これが典型的な方法です。

このコードには、外側のタグだけでなく、すべてのHTMLタグを含める必要があります。


.

理想的なソリューション:

ここでの最終目標は、テンプレート設計者が再帰関数を作成または変更する必要なしに理想的なナビゲーション構造を作成し、多次元の各レベルに対してforeachループを使用する必要がない方法を見つけることです。アレイ。 解決策は、特定の深さ制限に結び付けられるべきではありません。

HTMLのカスタマイズの例としては、ul / liタグ内に追加の属性を配置したり、CSSでスライドドア効果を実現するためにナビゲーションで一般的に使用されるspanタグなどの出力テキストを囲む新しいタグを囲むことまであります。 だから私は適切な解決策は少なくともこれらのケースシナリオをサポートする必要があると思います。

コールバック関数がデザイナのHTMLで使用するために必要な変数をテンプレートに返すような方法で使用できる限り、array_walk()を使用してテンプレートから配列を繰り返し処理しても問題ありません。

理想的には、array_walk_recursive()がそのイテレータが実際にどれだけ深いレベルであるかを知っていれば、私はこの偉業が解決するのがはるかに簡単だろうと思います。 しかし、誰かがその問題に対する回避策を知らない限り、解決策は全く異なるかもしれません。

私はまた、ツリーを構築するためのJavaScriptメソッドの使用を避けたいと思います。 そして、スイッチを使わないようにする方法があるならば、私はそこでも提案を受け入れます。

1 Answer


1


あなたが送り返したい情報を管理し保存するクラスを書くことを考えたことはありますか? 関数はそのクラスのインスタンスを変更することができますし、最後にいっぱいになったオブジェクトを渡します。

あなたのコンテンツはクラスの中にカプセル化されます、そしてあなたはユーザーがデータを操作して出力するためのすべてのメソッドとユーティリティを書くことができます。 ユーティリティメソッドをクラス内に記述してレベル数などを表示することもできます。

私は自分で試したことはありませんが、ここから始めることにします。クラスでは、ユーザーが望んでいることを絞り込んで拡張することができます。