2017-05-31 187 views
3

我在页面上有类别(表示为复选框)。在下一页我有第一页的分类子类。在第二页中的元素的下一页子类别等等。我将所有选择的项目保存在代表在不同级别进行选择的数组中。问题是我不知道如何从所有这些数组中构建树结构。让我说我现在有什么:PHP从4个阵列构建树型结构阵列

我有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是属于(用于例如:2级: )

id=1; name = programming, category_id = 1; 

我可以通过查询数据库找到关系。

在上述情况下,来自l2的两个元素都是l1 [0]的子类别。 来自等级3的前2个元素是l2 [0]的子类别,后2个元素是l2 [1]的子类别,并且在级别4中,其中一些是3级中的smth的子类别(并非每个元素都可能具有子类别)。

如何为所有这些数据构建树状结构的JSON?任何想法或建议?谢谢!

+0

这个问题与JSON无关。你想在本地PHP数据结构(数组,对象)中创建你的“树结构”,然后如果你想要一个JSON版本,把它序列化为'json_encode'。 – JAAulde

+0

O知道,但问题是,我不知道如何做树结构 –

+0

我明白这一点。我的观点是你一直在谈论JSON,并将问题标记为JSON。如果你想得到很好的帮助,请将你的问题集中在真正的问题上。 – JAAulde

回答

1

首先,如果我不明白你的问题,请道歉。

让我解释一下你的问题,我的理解是:

第一页

你显示它包含复选框名为“类别”形式和值是特定的主要类别的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查询的单页解决方案。

+0

你明白一切正确!我知道我必须编写一个递归函数,但我不知道该怎么做。我可能不得不建立多达30或40个阵列。我看不到任何解决这个问题的最佳方法 –

+0

我不知道从哪里开始。为了更清楚一点,在表4的数据库中,我将relationship_id设置为3级 –