我有一个页面类别(表示为复选框)。在下一页我有第1页的类别子类别。在下一页第二页中元素的子类别,依此类推。我将所有选定的项保存在数组中,表示在不同级别中做出的选择。问题是我不知道如何从所有这些数组中创建树结构。让我说一下我现在的情况:
我有4个数组,让我们将它们想象为4个级别(每个级别代表#页面上选中的复选框)。我在其中保留用户选择的复选框。以下是数据示例:(该值表示数据库中项目的ID)
The l1 value of $_SESSION['0'] is '1'
The l2 value of $_SESSION['0'] is '2'
The l2 value of $_SESSION['1'] is '3'
The l3 value of $_SESSION['0'] is '3'
The l3 value of $_SESSION['1'] is '4'
The l3 value of $_SESSION['2'] is '5'
The l3 value of $_SESSION['3'] is '6'
The l4 value of $_SESSION['0'] is '1'
The l4 value of $_SESSION['1'] is '2'
The l4 value of $_SESSION['2'] is '3'
The l4 value of $_SESSION['3'] is '4'
The l4 value of $_SESSION['4'] is '5'
对于数据库中的每个id,我都拥有它所属项目的id(例如:level 2:)
id=1; name = programming, category_id = 1;
我可以通过查询数据库找到关系。
在上述情况下,来自l2的两个元素都是l1 [0]的子类别。 第3级中的前2个元素是l2 [0]的子类别,后2个元素是l2 [1]的子类别,而在第4级中,其中一些元素是第3级中的某些子类别(并非每个元素都可能具有子类别)。
如何为所有这些数据构建树形结构的JSON?任何想法或建议?谢谢!
答案 0 :(得分:1)
首先,如果我不理解你的问题,请道歉。
让我以我理解的方式解释你的问题:
第一页
您显示的表单包含名称为“category”的复选框,值为特定主类别的ID
第二页着陆
使用检查类别填充数组(我称之为$ _SESSION ['categories_checked'])
在第二页
您显示级别1的子类别与在主页面上显示类别的方式相同。假设表单元素名称为“subcat1”
在第三页登陆
使用check子类别填充数组(我称之为$ _SESSION ['subcats1_checked'])
在第三页
您显示级别2的子类别与在主页面上显示类别的方式相同。假设表单元素名称为“subcat2”
第四页登陆
使用check子类别填充数组(我称之为$ _SESSION ['subcats2_checked'])
在第四页
您显示级别3的子类别与在主页面上显示类别的方式相同。假设表单元素名称为“subcat3”
在最终页面着陆
使用check子类别填充数组(我称之为$ _SESSION ['subcats3_checked'])
我的回答
从我的观点来看,我宁愿做以下事情:
嵌套数组
$_SESSION['categories'] = [
3 => [
56 => [
89 => [
121 => [1,2,3,4,5,],
],
],
],
];
这种表现似乎更接近现实,应该更容易展示。
下一步是创建一个递归函数,在该函数中,您将传递一步形式的结果数组和$ _SESSION ['categories']变量。
让我知道解决方案是否适合您......如果有必要,我可以帮您解决。
因此,递归是成功的关键,但是......
缺少某些东西......为了处理您的结果并使用我提到的PHP数组,您必须以这样的方式构建表单:
第一页
<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查询的单页解决方案。