2017-02-07 11 views
3

MySQL導航表使用id,parent_id,name具有無限的導航深度。我正在使用遞歸函數來創建多維數組。我一直試圖小時是創建放路徑(/ mainitem /子項目/ subsubsitem/subsubsubitem /等菜單表的menu_nl功能:使用多維PHP數組爲MySQL數據庫中的每個菜單項創建友好的URL

Description of table 'menu'

$ Q =「 SELECT m.id,m.parent_id,m.menu_nl,parents.menu_nl AS'parent' FROM menu AS m LEFT JOIN菜單AS父母ON父母.id = m.parent_id ORDER BY m.parent_id ASC,m.volgorde ASC 「;

$ r = $ dbcon-> query($ q); $ pages = $ r-> fetchAll(PDO :: FETCH_ASSOC);

function create_array(array $elements, $parentId = 0) { 

    $branch = array(); 

    foreach ($elements as $element) { 
     if ($element['parent_id'] == $parentId) { 


      $children = create_array($elements, $element['id']); 

      if ($children) { 
       $element[$element['menu_nl']] = $children; 
      } 


      $branch[] = $element; 
     } 
    } 

    return $branch; 
} 

$ tree = create_array($ pages);

一個var_export看起來這樣:

array (
    0 => 
    array (
    'id' => 34, 
    'parent_id' => 0, 
    'menu_nl' => 'INTRODUCTION', 
    'parent' => NULL, 
), 
    1 => 
    array (
    'id' => 36, 
    'parent_id' => 0, 
    'menu_nl' => 'TEAM', 
    'parent' => NULL, 
    'TEAM' => 
    array (
     0 => 
     array (
     'id' => 133, 
     'parent_id' => 36, 
     'menu_nl' => 'Team member A', 
     'parent' => 'TEAM', 
    ), 
     1 => 
     array (
     'id' => 134, 
     'parent_id' => 36, 
     'menu_nl' => 'Team member B', 
     'parent' => 'TEAM', 
    ), 
    ), 
), 
    2 => 
    array (
    'id' => 50, 
    'parent_id' => 0, 
    'menu_nl' => 'PRODUCTS', 
    'parent' => NULL, 
    'PRODUCTS' => 
    array (
     0 => 
     array (
     'id' => 151, 
     'parent_id' => 50, 
     'menu_nl' => 'SUB PRODUCT A', 
     'parent' => 'PRODUCTS', 
     'SUB PRODUCT A' => 
     array (
      0 => 
      array (
      'id' => 154, 
      'parent_id' => 151, 
      'menu_nl' => 'SUB OF SUB PRODUCT A', 
      'parent' => 'SUB PRODUCT A', 
      'SUB OF SUB PRODUCT A' => 
      array (
       0 => 
       array (
       'id' => 156, 
       'parent_id' => 154, 
       'menu_nl' => 'SUB OF SUB OF SUB PRODUCT A', 
       'parent' => 'SUB OF SUB PRODUCT A', 
      ), 
      ), 
     ), 
     ), 
    ), 
     1 => 
     array (
     'id' => 152, 
     'parent_id' => 50, 
     'menu_nl' => 'SUB PRODUCT B', 
     'parent' => 'PRODUCTS', 
     'SUB PRODUCT B' => 
     array (
      0 => 
      array (
      'id' => 155, 
      'parent_id' => 152, 
      'menu_nl' => 'SUB OF SUB PRODUCTB', 
      'parent' => 'SUB PRODUCT B', 
     ), 
     ), 
    ), 
     2 => 
     array (
     'id' => 153, 
     'parent_id' => 50, 
     'menu_nl' => 'SUB PRODUCT C', 
     'parent' => 'PRODUCTS', 
    ), 
    ), 
), 
    3 => 
    array (
    'id' => 40, 
    'parent_id' => 0, 
    'menu_nl' => 'CONTACT', 
    'parent' => NULL, 
    'CONTACT' => 
    array (
     0 => 
     array (
     'id' => 139, 
     'parent_id' => 40, 
     'menu_nl' => 'Contact form', 
     'parent' => 'CONTACT', 
    ), 
     1 => 
     array (
     'id' => 143, 
     'parent_id' => 40, 
     'menu_nl' => 'How to get there', 
     'parent' => 'CONTACT', 
    ), 
    ), 
), 
) 
+0

我覺得這個還是有點過於抽象和廣泛。你能提供一些真正的數據來玩嗎?嘗試'var_export($ array);'以獲得有形的東西在這裏發佈。並且不應該'返回$ pad;'返回$ path;'在你的函數中? –

+0

你是對的傑夫,$ pad當然是$路徑中的回報。我已經添加了一塊數組,謝謝 –

+0

如果您使用'var_export'而不是'print_r',它可以讓我們輕鬆地複製/粘貼功能代碼。 –

回答

1

數組中保存元素的FULLPATH父代與自己的路的串聯。然後在遞歸函數中將其作爲參數傳遞。

live demo

example repository

<?php 

// add $parentpath parameter 
function create_array(array $elements, $parentId = 0, $parentpath = '') { 

    $branch = array(); 

    foreach ($elements as $element) { 
     // set the fullpath from parent concatenated to this menu_nl 
     $element['fullpath'] = "$parentpath/$element[menu_nl]"; 

     if ($element['parent_id'] == $parentId) { 

      // pass the fullpath down to its children 
      $children = create_array($elements, $element['id'], $element['fullpath']); 

      if ($children) { 
       $element[$element['menu_nl']] = $children; 
      } 

      $branch[] = $element; 
     } 
    } 

    return $branch; 
} 

$pages = require 'pages.php'; 

print_r(create_array($pages)); 
Array 
(
    [0] => Array 
     (
      [id] => 34 
      [parent_id] => 0 
      [menu_nl] => INTRODUCTION 
      [parent] => 
      [fullpath] => /INTRODUCTION 
     ) 

    [1] => Array 
     (
      [id] => 36 
      [parent_id] => 0 
      [menu_nl] => TEAM 
      [parent] => 
      [fullpath] => /TEAM 
      [TEAM] => Array 
       (
        [0] => Array 
         (
          [id] => 133 
          [parent_id] => 36 
          [menu_nl] => Team member A 
          [parent] => TEAM 
          [fullpath] => /TEAM/Team member A 
         ) 

        [1] => Array 
         (
          [id] => 134 
          [parent_id] => 36 
          [menu_nl] => Team member B 
          [parent] => TEAM 
          [fullpath] => /TEAM/Team member B 
         ) 

       ) 

     ) 

    [2] => Array 
     (
      [id] => 50 
      [parent_id] => 0 
      [menu_nl] => PRODUCTS 
      [parent] => 
      [fullpath] => /PRODUCTS 
      [PRODUCTS] => Array 
       (
        [0] => Array 
         (
          [id] => 151 
          [parent_id] => 50 
          [menu_nl] => SUB PRODUCT A 
          [parent] => PRODUCTS 
          [fullpath] => /PRODUCTS/SUB PRODUCT A 
          [SUB PRODUCT A] => Array 
           (
            [0] => Array 
             (
              [id] => 154 
              [parent_id] => 151 
              [menu_nl] => SUB OF SUB PRODUCT A 
              [parent] => SUB PRODUCT A 
              [fullpath] => /PRODUCTS/SUB PRODUCT A/SUB OF SUB PRODUCT A 
              [SUB OF SUB PRODUCT A] => Array 
               (
                [0] => Array 
                 (
                  [id] => 156 
                  [parent_id] => 154 
                  [menu_nl] => SUB OF SUB OF SUB PRODUCT A 
                  [parent] => SUB OF SUB PRODUCT A 
                  [fullpath] => /PRODUCTS/SUB PRODUCT A/SUB OF SUB PRODUCT A/SUB OF SUB OF SUB PRODUCT A 
                 ) 

               ) 

             ) 

           ) 

         ) 

        [1] => Array 
         (
          [id] => 152 
          [parent_id] => 50 
          [menu_nl] => SUB PRODUCT B 
          [parent] => PRODUCTS 
          [fullpath] => /PRODUCTS/SUB PRODUCT B 
          [SUB PRODUCT B] => Array 
           (
            [0] => Array 
             (
              [id] => 155 
              [parent_id] => 152 
              [menu_nl] => SUB OF SUB PRODUCTB 
              [parent] => SUB PRODUCT B 
              [fullpath] => /PRODUCTS/SUB PRODUCT B/SUB OF SUB PRODUCTB 
             ) 

           ) 

         ) 

        [2] => Array 
         (
          [id] => 153 
          [parent_id] => 50 
          [menu_nl] => SUB PRODUCT C 
          [parent] => PRODUCTS 
          [fullpath] => /PRODUCTS/SUB PRODUCT C 
         ) 

       ) 

     ) 

    [3] => Array 
     (
      [id] => 40 
      [parent_id] => 0 
      [menu_nl] => CONTACT 
      [parent] => 
      [fullpath] => /CONTACT 
      [CONTACT] => Array 
       (
        [0] => Array 
         (
          [id] => 139 
          [parent_id] => 40 
          [menu_nl] => Contact form 
          [parent] => CONTACT 
          [fullpath] => /CONTACT/Contact form 
         ) 

        [1] => Array 
         (
          [id] => 143 
          [parent_id] => 40 
          [menu_nl] => How to get there 
          [parent] => CONTACT 
          [fullpath] => /CONTACT/How to get there 
         ) 

       ) 

     ) 

) 
+1

Jeff你給我提供了缺少的部分,這將工作得很好。謝謝!遞歸很難讓你的頭腦清晰,但在這種情況下,是最有效的方式來完成工作。平坦化和循環後,我將有一個完美的導航表,可以很容易地修改多語言版本的網站。再次感謝! –