まず、ご迷惑をおかけして申し訳ございませんが、ご容赦ください。
私はあなたの問題、私はそれを理解する方法を説明してみましょう:
最初のページを
あなたが名前「カテゴリ」でチェックボックスが含まれており、値が特定のメインカテゴリ
のIDでフォームを表示します2ページ目の着陸で
あなたは、配列を移入(私はそれを呼ぶだろう$ _SESSION [ 'categories_checked'] )2ページ目でチェックカテゴリ
で
あなたがレベル1は、メインページ上のカテゴリを表示するのと同じ方法のサブカテゴリを表示します。第三に、チェックのサブカテゴリ
で(私は$ _SESSION [「subcats1_checked」]、それを呼ぶだろう)あなたは、配列を移入3ページ目の着陸
で
のは、フォーム要素名は「subcat1」であるとしましょうページ
メインページにカテゴリを表示するのと同じ方法で、レベル2のサブカテゴリを表示します。のは、フォーム要素名は、チェックのサブカテゴリ第四に
と4ページ目の着陸で「subcat2」
あなたは、配列を移入
は(私はそれを呼ぶだろう$ _SESSION [「subcats2_checked」])としましょうページ
メインページにカテゴリを表示するのと同じ方法で、レベル3のサブカテゴリを表示します。のは、フォーム要素名は、チェックのサブカテゴリと最後のページの着陸で "subcat3"
あなたは、配列を移入
は(私はそれを呼ぶだろう$ _SESSION [ 'subcats3_checked'])としましょう
マイ私の視点から
に答えて、私はむしろ、次の操作を行います。
- 常に同じ変数名(HTMLフォームおよびPHPで)を使用するようにコードが大幅
- を向上させることができoptionnalyレベル
巣あなたのアレイ
$_SESSION['categories'] = [
3 => [
56 => [
89 => [
121 => [1,2,3,4,5,],
],
],
],
];
を含むであろう隠しフォーム要素を使用
この表現は現実に近いと思われ、表示しやすくする必要があります。
次のステップでは、1ステップ形式の結果の配列と$ _SESSION ['categories']変数を渡す再帰関数を作成します。
ソリューションがあなたにとって正しい方法であるかどうかを教えてください。必要に応じて手を差し上げることができます。
だから、再帰が成功の鍵ですが...
何かが欠落している...あなたの結果を扱い、私はmentionned PHPの配列を持つために、あなたはそのように、あなたのフォームを構築する必要があります:
最初のページ
<input type="checkbox" name="category[0]" value="1" /> Cat1 name
<input type="checkbox" name="category[0]" value="2" /> Cat2 name
2ページ目
Subcats of cat 1
<input type="checkbox" name="category[1]" value="110" /> SubCat1 name
<input type="checkbox" name="category[1]" value="222" /> SubCat2 name
Subcats of cat 2
<input type="checkbox" name="category[2]" value="110" /> SubCat1 name
<input type="checkbox" name="category[2]" value="222" /> SubCat2 name
このようにして、サブカテゴリがその親によってのみ定義されるため、レベル入力要素を避けることができます。 もちろん、これはすべてのカテゴリとサブカテゴリが異なるIDを持つことを意味します(そうでない場合はトリックが可能です)。ここで
は、スクリプト全体をスキャンする必要がありますので、これは明らかにデータを扱うための最適化された方法ではありません
注意してください、あなたに
<?php
/**
* Created by PhpStorm.
* User: dvienne
* Date: 31/05/2017
* Time: 15:16
*/
function treatCategories($parentCatId, $selectedId, $categories) {
foreach($categories as $categoryID => $category) {
if(empty($category) AND ($categoryID==$parentCatId)) {
$categories[$categoryID][$selectedId] = [];
break;
} elseif(is_array($category) AND empty($category)) {
/** RECURSION */
treatCategories($parentCatId, $selectedId, $category);
}
}
$_SESSION['categories'] = $categories;
}
$userSelection = $_POST['categories'];
$level = $_POST['level'];
if(!empty($_SESSION['categories'])) {
$categories = $_SESSION['categories'];
} else {
$categories = [];
}
if(!empty($categories)) {
foreach($userSelection as $parentCatId => $selectedId) {
treatCategories($parentCatId, $selectedId, $categories);
}
} else {
foreach($userSelection as $catId) {
$categories[$catId] = [];
}
$_SESSION['categories'] = $categories;
}
を助けるべきで迅速かつ汚いコードですカテゴリ配列の値を挿入します。 AJAXクエリを使用して1ページのソリューションを検討する必要があります。
この質問はJSONとは関係ありません。ネイティブのPHPデータ構造(配列、オブジェクト)で "ツリー構造"を作成したい場合、JSONバージョンをシリアル化するにはJSON_encodeを使用します。 – JAAulde
O知っているが、問題は私がドンではない、木構造をする方法を知っている –
私はそれを理解しています。私の主張は、JSONについて話し続け、JSONとしてタグ付けされた質問があることです。あなたが良い助けを求めたいのであれば、あなたの質問は本当の問題に集中してください。 – JAAulde