首先,如果我不明白你的问题,请道歉。
让我解释一下你的问题,我的理解是:
第一页
你显示它包含复选框名为“类别”形式和值是特定的主要类别的IDS
在第二页着陆
您填充数组(我会称之为$ _SESSION [ 'categories_checked'] )与检查类别
在第二页
您显示1级你显示主页上的类别以同样的方式的子类别。比方说,表单元素名称是“subcat1”
在第三页的目标
您填充数组与检查小类
在第三(我想$ _SESSION [“subcats1_checked”]称呼它)页面
显示级别2的子类别与在主页面上显示类别的方式相同。比方说,表单元素名称是检查小类
在第四个“subcat2”
在第四页着陆
您填充数组(我会称之为$ _SESSION [“subcats2_checked”])页面
显示级别3的子类别与在主页面上显示类别的方式相同。比方说,表单元素名称是检查子类别 “subcat3”
在最后一页上着陆
您填充数组(我会称之为$ _SESSION [ 'subcats3_checked'])
我回答
从我的角度来看,我宁愿做到以下几点:
- 总是使用相同的变量名(以HTML形式和PHP),这样的代码可以大大提高
- optionnaly使用,其中将包括水平
巢您的数组一个隐藏的表单元素
$_SESSION['categories'] = [
3 => [
56 => [
89 => [
121 => [1,2,3,4,5,],
],
],
],
];
这种表示似乎更接近现实,应该更容易显示。
下一步是创建一个递归函数,您将在该函数处传递一个单步形式的结果数组和$ _SESSION ['categories']变量。
让我知道如果解决方案是适合您的方式......如果需要,我可以帮助您。
所以,递归是成功的关键,但...
有遗漏......为了治疗你的结果,并有PHP数组我mentionned,你将有来构建你的形式的方式:
第一页
<input type="checkbox" name="category[0]" value="1" /> Cat1 name
<input type="checkbox" name="category[0]" value="2" /> Cat2 name
第二页
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查询的单页解决方案。
这个问题与JSON无关。你想在本地PHP数据结构(数组,对象)中创建你的“树结构”,然后如果你想要一个JSON版本,把它序列化为'json_encode'。 – JAAulde
O知道,但问题是,我不知道如何做树结构 –
我明白这一点。我的观点是你一直在谈论JSON,并将问题标记为JSON。如果你想得到很好的帮助,请将你的问题集中在真正的问题上。 – JAAulde