2014-10-19 165 views
0

我有一個菜單系統的SQL表。它具有「id」作爲索引,「顯示」字段和「父」字段。這些是數據:有沒有辦法從SQL查詢返回綁定結果?

id, display, parent 
1, File, 0 
2, View, 0 
3, Window, 0 
4, Open, 1 
5, Save, 1 
6, Export, 1 
7, Export to Image, 6 
8, Export to PDF, 6 
9, JPEG, 7 
10, PNG, 7 

我想有一個函數返回HTML選擇格式的菜單層次結構。所需的輸出應該是這樣的:

<option value='1'>File</option> 
<option value='4'>-- Open</option> 
<option value='5'>-- Save</option> 
<option value='6'>-- Export</option> 
<option value='7'>---- Export to Image</option> 
<option value='9'>------ JPEG</option> 
<option value='10'>------ PNG</option> 
<option value='8'>---- Export to PDF</option> 
<option value='2'>View</option> 
<option value='3'>Window</option> 

這是我想出了以下功能:

function SelectPage($pdo, $default = "", $depth = 0, $id = 0, $opts = "") { 
    $sql = $pdo->prepare("SELECT id,display FROM pages WHERE parent = ?"); 
    $sql->execute(array($id)); 
    while ($row = $sql->fetch(PDO::FETCH_ASSOC)) { 
    $opts .= "<option value='{$row["id"]}'>"; 
    $opts .= trim(str_repeat("--", $depth) . " "); 
    $opts .= "{$row["display"]}</option>"; 
    $tmp = SelectPage($pdo, $default, ($depth + 1), $row["id"], $opts); 
    $opts = $tmp; 
    } 
    return $opts; 
} 

它的工作原理,但我懷疑這是多麼有效。我想知道是否有一種方法可以使SQL查詢以正確的順序返回它們,以便我可以避免對自己進行循環調用?

回答

1

不要在你的sql語句中使用遞歸。在一個查詢中,將所有類別按如下排列:

$categories = array( 
    array(
    'id' => 1, 
    'name' => 'File', 
    'parent' => 0 
    ), 
    ... etc. 
); 

接下來使用這個簡單的函數。你可以修改,如果你想。

function isSubCategory($id, $cats) 
{ 
    foreach($cats as $cat) 
    { 
     if($id != $cat['id'] && $id == $cat['parent']) 
     return true; 
    } 
    return false; 
} 
echo '<select>'; 
function getRecursiveTree($parent, $cats, $level = -1) 
{ 
    $separator = '-'; 
    foreach($cats as $i => $cat) 
    { 
     if($cat['parent'] == $parent) 
     { 
      $level++; 
     if(isSubCategory($cat['id'], $cats)) 
     { 
     echo '<option value="',$cat['id'],'">', str_repeat($separator, $level) , $cat['name'],'</option>' . PHP_EOL; 
     getRecursiveTree($cat['id'], $cats, $level);       
     } 
     else 
     { 
     echo '<option value="',$cat['id'],'">', str_repeat($separator, $level) , $cat['name'],'</option>' . PHP_EOL; 
     } 
     $level--;   
    } 
    } 
} 

echo (getRecursiveTree(0, $k)); 
    echo '</select>';