PHP从4个数组

时间:2017-05-31 12:11:42

标签: php json algorithm

我有一个页面类别(表示为复选框)。在下一页我有第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?任何想法或建议?谢谢!

1 个答案:

答案 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'])

我的回答

从我的观点来看,我宁愿做以下事情:

  • 始终使用相同的变量名称(在HTML表单和PHP中),因此代码可以大大改进
  • optionnaly使用隐藏的表单元素,其中包含级别
  • 嵌套数组

    $_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查询的单页解决方案。