Php 存储类别和子类别时,可能会出现无限子和#x27;s、 以及一个函数,用于将它们从MYSQL返回到JSON

Php 存储类别和子类别时,可能会出现无限子和#x27;s、 以及一个函数,用于将它们从MYSQL返回到JSON,php,mysql,json,Php,Mysql,Json,我目前的职能: $categories = array(); $db -> new PDO(connect); foreach($db->query('SELECT * FROM categories') as $row) { $category = array(); array_push($category, $row['categoryID']); foreach($db->query("SELECT * FROM subcategorie

我目前的职能:

$categories = array();
$db -> new PDO(connect);

foreach($db->query('SELECT * FROM categories') as $row) {

     $category = array();
     array_push($category, $row['categoryID']);
     foreach($db->query("SELECT * FROM subcategories WHERE categoryID = {$row['categoryID']} ") as $row2) 
     {
          if ($row2["subcatparentID"] == null) {
               $category[$row['categoryID']][] = $row2['subcatID'];
          }
          //Here I need to get all the subcats with parent subcats, and 
          //then I need to add the subcategory to $category finding the parent subcategory
          //mentioned before. So, I need a infinite multi-dimensional search function or something..
          //Plus, I need to use a repeating while loop to make sure all subcategories with 
          //parents are added into the array, because if 14 is linked to 11 and 11 is linked to
     }
 $categories[] = $category;
}

return json_encode($categories);
这是我目前唯一的想法。如果父子类别可以是任何维度,我如何找到它?例如,子类别11链接到12,12链接到14,14链接到13,我将有$category[13][14][12][11]

我的表格结构如下:

{"1":[41[43,42[45, 44]]],"2":[26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"3":[56,57,58,59,60,61],"4":[62,63,64],"5":[1,2,3,4,5,6,21[22,23]]}
表“子类别”:子类别ID、类别ID、名称、子类别ID

表“类别”:categoryID,name//这些是主要类别

作为JSON格式的回报,我希望如下所示:

{"1":[41[43,42[45, 44]]],"2":[26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"3":[56,57,58,59,60,61],"4":[62,63,64],"5":[1,2,3,4,5,6,21[22,23]]}

尽管这似乎不适用于JSON.parse,但奇怪的是。

一种递归方法的想法:-

<?php

$categories = array();
$db -> new PDO(connect);

foreach($db->query('SELECT * FROM categories') as $row) 
{
    $categories[$row['categoryID']] = get_sub_categories($db, $row['categoryID']);
}

return json_encode($categories);

function get_sub_categories($db, $parent_category)
{
    $return_categories = array();
    foreach($db->query("SELECT * FROM subcategories WHERE categoryID = $parent_category ") as $row2) 
    {
        $return_categories[$row2['subcatID']] = get_sub_categories($db, $row2['subcatID']);
    }
    return $return_categories;
}

?>

未测试,但这将为您提供一个数组,其中键是类别,值是该类别下的类别数组(每个类别可以是数组,等等)

编辑-仍然不是100%,但通过循环执行此操作,但从树的底部开始,使用array_unshift将子类别预先添加到每个类别的数组中

这取决于当子类别是该类别下的最高类别时,Subcategory ID设置为0,但如果其他内容很容易更改

未经测试

<?php

$categories = array();
$db -> new PDO(connect);

$categories = array();

foreach($db->query('SELECT categories.categoryID, a.subcatID, a.subcatparentID
                    FROM categories
                    INNER JOIN subcategories a ON categories.categoryID = a.categoryID
                    LEFT OUTER JOIN subcategories b ON a.categoryID = b.categoryID AND a.subcatID = b.subcatparentID
                    WHERE b.subcatID IS NULL
                    ') as $row) 
{
    $categories[$row['categoryID']] = array();
    $parent = $row['subcatparentID']
    while($parent != 0)
    {
        // following should only get a single row
        foreach($db->query("SELECT subcatID, subcatparentID FROM subcategories WHERE categoryID = $row['categoryID'] AND subcatID = $parent") as $row2) 
        {
            array_unshift($categories[$row['categoryID']], $row2['subcatID']);
            $parent = $row2['subcatparentID']
        }
    }
}

?>

MySQL不支持递归查询。这意味着您的主要选择是设置递归mysql过程以返回详细信息,在您选择的脚本语言中使用递归函数以重复执行SQL,或者重新设计数据库以使用嵌套的set方法。哪种方法最好取决于具体情况(即,嵌套集方法读取速度非常快,但更新速度较慢),无法在多维数组中进行搜索?在使用您正在使用的邻接集模型的单个查询中,这是不可能的。您需要执行递归查询(这可能需要很长时间)。遗憾的是,我不理解这一点。您没有使用parentID?这是递归函数获取类别的子记录及其子记录等的基本示例。但我不确定你们的桌子是如何构造的。如果您可以使用表结构和一些示例数据修改您的原始帖子,以及您希望从这些示例数据中输出的内容,我可以尝试提出一些更符合您要求的内容。我希望javascript使用一个数组,如类别[1,2,3,4,5,6,7,8,9,10],其中类别[2][29,30,31,34,35]链接,然后以类别[2][35][32][33]为例。我用表格格式编辑了原始帖子。那么,当一位家长有两个直系子女时,你会怎么做?它是否为每个可能的父/子链提供了完整的数组?请尝试一下。可能格式不太正确,但应该很接近。