2014-11-20 74 views
1

我已经建立从MySQL结果正确的阵列预期JSON格式的一个问题:构建阵列格式JSON

表:

 
    CREATE TABLE `Config_Category` (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(50) NOT NULL DEFAULT '0', 
    `topid` INT(8) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`) 
    ) 
    ; 

填写表格:

 
id name  topid 
2 DVD   1 
3 Matrix  2 
4 CD   1 
5 Deep Purple 4 
6 Pink Floyd 4 
7 Batman  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" 
     } 
    ] 
} 
] 

回答

0

它,使用空方括号[]是什么原因造成这种现象在我看来。你应该试着用一个变量作为计数器:

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++; 
} 
+0

计数器不招。 组名将不会显示在输出中 – UsaNaim 2014-11-26 20:59:48

0

我遇到过这样的DB访问模式。我通常可以加速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; 
}