【问题标题】:Build array from MySQL query to format json从 MySQL 查询构建数组以格式化 json
【发布时间】:2015-01-19 00:55:40
【问题描述】:

我在从 mysql 结果为预期的 json 格式构建正确的数组时遇到问题:

表:

创建表`Config_Category`( `id` INT(11) NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NOT NULL DEFAULT '0', `topid` INT(8) NOT NULL DEFAULT '0', 主键(`id`) ) ;

填满表格:

id 名称 topid 2 DVD 1 3 矩阵 2 4 光盘 1 5 深紫色 4 6平克弗洛伊德4 7蝙蝠侠2
MyClass
{
    public function getMenu($topid)
    {

        $stmt = $this->pdoDash->query("SELECT id,name 
            FROM Config_Category WHERE topid='$topid'");

        $results = $stmt->fetchAll(PDO::FETCH_ASSOC);

        foreach ($results as $row)
        {
            if ($this->hasChildKats($row['id']))
            {
                $path[] = array("group" => $row['name']);
                $path[] = array_merge($this->getMenu($row['id'], $path));

            } else
            {
                $path["item"][] = array("name" => $row['name']);

            }
        }
        return $path;
    }

    private function hasChildKats($katID)
    {
        $stmt = $this->pdoDash->query("SELECT count(*) 
            FROM Config_Category WHERE topid='$katID'");

        return $stmt->fetchColumn();
    }
}

$this->test = new MyClass;
echo json_encode($this->test->getMenu());

我的结果:

[
{
    "group": "DVD"
},
{
    "item": [
        {
            "name": "Matrix"
        },
        {
            "name": "Batman"
        }
    ]
},
{
    "group": "CD"
},
{
    "item": [
        {
            "name": "Pink Floyd"
        },
        {
            "name": "Deep Purple"
        }
    ]
}
]

预期结果:

[
{
    "group": "DVD",
    "item": [
        {
            "name": "Matrix"
        },
        {
            "name": "Batman"
        }
    ]
},
{
    "group": "CD",
    "item": [
        {
            "name": "Pink Floyd"
        },
        {
            "name": "Deep Purple"
        }
    ]
}
]

【问题讨论】:

    标签: php mysql arrays json multidimensional-array


    【解决方案1】:

    在我看来,使用空括号 [] 是导致这种行为的原因。您应该尝试使用变量作为计数器:

    var $counter = 0;
    
    foreach ($results as $row)
    {
        if ($this->hasChildKats($row['id']))
        {
            $path[$counter] = array("group" => $row['name']);
            $path[$counter] = array_merge($this->getMenu($row['id'], $path));
    
        } else
        {
            $path["item"][$counter] = array("name" => $row['name']);
        }
        $counter++;
    }
    

    【讨论】:

    • 计数器不是诀窍。组名不会显示在输出中
    【解决方案2】:

    我经常遇到这样的数据库访问模式。我通常可以将它们加速 100 倍或更多。似乎您在打印出来的菜单中每行至少点击一次数据库。然而,这可以通过一个 DB 调用和一个 PHP 循环来解决。

    这是一个如何工作的示例。 (可能与您的数据模型不完全匹配)。 注意:我总是以复数形式命名项目数组,所以我故意将“项目”改为“项目”

    public function getMenu($topid) {
    
        $stmt = $this->pdoDash->query("SELECT id, name, topid FROM Config_Category");
        $results = $stmt->fetchAll(PDO::FETCH_ASSOC);
    
        $path = array();
        foreach ($results as $row) {
            if ($row['topid'] == 1) {   // top level category
                $path[$row['id']] = array();
                $path[$row['id']]['group'] = row['name'];
            } else {    // child category
                $path[$row['topid']]['items'][] = array('name'=>row['name']);
            }
        }
        return $path;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 1970-01-01
      • 2020-05-06
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 2011-10-26
      相关资源
      最近更新 更多