动态多维数组自行覆盖

Posted

技术标签:

【中文标题】动态多维数组自行覆盖【英文标题】:Dynamic multidimensional array overrides it self 【发布时间】:2015-03-20 00:48:14 【问题描述】:

编辑: 我已经试验了一段时间,似乎它可能是每次调用只给我一行的 SQL,我可以优化它还是用另一种方式编写它?


尝试从 DB 创建/获取动态多维数组/菜单,但它不会打印出我在 DB 中的所有行。示例:当打印出两行时,我现在得到的 SQL 只得到一个,当使用嵌套数组 display_children 时,每个数组也只得到一行。我尝试用下面的 JSON 示例来解释这种现象。

我试图通过函数发送一个变量,所以每次调用都会将它自己的“级别”值添加到函数内的每个变量中,但没有成功。

这是我的结果示例(使其更具可读性):

[
    
        "category_id": "1",
        "title": "First test",
        "categories": [
            
                "category_id": "2",
                "title": "Second category",
                "categories": [
                    
                        "category_id": "3",
                        "title": "3",
                        "categories": ""
                    
                ]
            
        ]
    
]

这就是我想要/期望的:

[
    
        "category_id": "1",
        "title": "First test",
        "categories": [
            
                "category_id": "2",
                "title": "Second category",
                "categories": [
                    
                        "category_id": "3",
                        "title": "3",
                        "categories": ""
                    
                ]
            ,
            
                "category_id": "4",
                "title": "Fourth category",
                "categories": ""
            
        ]
    
]

数据库表:

代码如下:

<?php
/* DB info and so on above this line */
function display_children($parent) 

    if(!empty($parent)) 

        global $dbh;
        $query = "SELECT category.*,
                        GROUP_CONCAT(category_hierarchy.category_id SEPARATOR ',') AS subcategories
                    FROM        category 
                    LEFT JOIN   category_hierarchy
                        ON      category_hierarchy.category_parent_id = category.category_id
                    WHERE       category.type = 2 AND ";

        $queryArr   = array();
        $queryArrValue = array();

        $parents = explode(',', $parent);

        foreach($parents as $value) 
            $queryArr[]     = "(category.category_id = ?)";
            $queryArrValue[]    = $value;
        

        $queryArr = implode(' OR ', $queryArr);

        $query .=   "(".$queryArr.")";
        $query .=   " ORDER BY category.sort_order ASC";

    // Prepare.
        $stmt = $dbh->prepare($query);

    // Execute.
        $stmt->execute($queryArrValue);

    // Fetch results.
        $categories = $stmt->fetchAll();

        $returnArr = array();

                    foreach($categories as $category) 

                        if(!empty($category['subcategories'])) 
                            $parent_arr = array(display_children($category['subcategories']));
                         else 
                            $parent_arr = '';
                        

                        $returnArr[] = array(
                            'category_id'   => $category['category_id'],
                            'title'         => $category['title'],
                            'slug'          => $category['slug'],
                            'url'           => $category['url'],
                            'type'          => $category['type'],
                            'sort_order'    => $category['sort_order'],
                            'categories'    => $parent_arr
                            );
                    

                    return $returnArr;
    



$arr = array();

// Query.

    $query =    "SELECT         category.*,
                                GROUP_CONCAT(category_hierarchy.category_id SEPARATOR ',') AS subcategories     
                FROM            category 
                LEFT JOIN       category_hierarchy
                    ON          category_hierarchy.category_parent_id = category.category_id
                WHERE           category.type = 1
                ORDER BY        category.sort_order ASC
                ";

    // Prepare.
        $stmt = $dbh->prepare($query);

    // Execute.
        $stmt->execute();

    // Fetch results.
        $categories = $stmt->fetchAll();

        $countedRows = count($categories);

        foreach($categories as $category) 
            $parent_arr = '';
            if(!empty($category['subcategories'])) 
                $parent_arr = array(display_children($category['subcategories']));
             

            $arr[] = array(
                    'category_id'   => $category['category_id'],
                    'title'         => $category['title'],
                    'slug'          => $category['slug'],
                    'url'           => $category['url'],
                    'type'          => $category['type'],
                    'sort_order'    => $category['sort_order'],
                    'categories'    => $parent_arr
            );
        

/* Output JSON */
    header('Content-type: application/json');
    echo json_encode($arr);
    die();
?>

【问题讨论】:

这样更具可读性?试试JSONLint! 谢谢,现在它更具可读性...我还添加了有关我的问题的更多信息。 我不确定我是否遵循您的问题,但有可能在function display_children 末尾的foreach 循环中@您return array( ...。这将返回第一个循环(第一个 db 行/子项)并切出函数,即使有更多行。 谢谢,现在我使用一个多维数组来代替返回。不过,我试图描述的第一个问题仍然困扰着我。当我尝试制作一个简单的数组时,比如说 tre 行,它只返回第一个。但是当使用display_children 时,我只为嵌套在另一个数组中的每个数组得到一行,这就是我试图用我的 JSON 示例展示的内容。就像某些东西被覆盖并且不会被打印出来。 【参考方案1】:

这是 SQL,因为我使用的是 GROUP_CONCAT,所以我必须添加 GROUP BY

SELECT      
category.*,
GROUP_CONCAT(category_hierarchy.category_id SEPARATOR ',') AS subcategories 

FROM            category
LEFT JOIN       category_hierarchy    ON        category.category_id = category_hierarchy.category_parent_id
WHERE           category.type = '1'

GROUP BY        category.category_id
ORDER BY        category.sort_order ASC

See description to answer here

【讨论】:

以上是关于动态多维数组自行覆盖的主要内容,如果未能解决你的问题,请参考以下文章

动态创建多维对象/数组

如何分配动态静态多维数组

动态访问多维数组值

动态处理多维数组作为 UIImage 数组

jQuery/JS 中的动态多维数组

填充临时数组以避免在动态多维数组上使用 Preserve