2016-02-11 15 views
1

我想用PHP和MySQL構建一個Evernote樣式的筆記應用程序。如何從MySQL數據庫記錄中生成一個用於多級文件夾結構的PHP數組

印象筆記允許頂層文件夾中有筆記記錄。

我想讓我的應用程序允許文件夾位於文件夾內,因此頂層文件夾可以有一個子文件夾,然後在子文件夾內有註釋記錄。

像下面這個圖片...

enter image description here


我有這個PHP函數將建立上圖中所示的結構菜單...

此代碼建立顯示菜單

<?php 
function tree($array, $parent, $parts = array(), $step = 0) { 

    if (!count($array)) { 
     return ''; 
    } 

    $tid = ($step == 0) ? 'id="tree"' : ''; 
    $t = '<ul class="unstyled" '.$tid.'>'; 

    foreach ($array as $key => $item) { 
     if (is_array($item)) { 
      $open = $step !== false && (isset($parts[$step]) && $key == $parts[$step]); 

      $t .= '<li class="directory'. ($open ? ' open' : '') .'">'; 
       $t .= '<a href="#" data-role="directory"><i class="glyphicon glyphicon-folder-'. ($open ? 'open' : 'close') .'"></i>&nbsp; ' . $key . '</a>'; 
       $t .= tree($item, "$parent/$key", $parts, $open ? $step + 1 : false); 
      $t .= '</li>'; 
     } else { 
      $selected = (isset($parts[$step]) && $item == $parts[$step]); 
      $t .= '<li class="file'. ($selected ? ' active' : '') .'"><a href="'. $parent .'/'. $item . '">'.$item.'</a></li>'; 
     } 
    } 

    $t .= '</ul>'; 

    return $t; 
} 
?> 

上面的代碼通過調用上述_getTree()

protected function _getTree($dir = LIBRARY) 
{ 
    $return = array('directories' => array(), 'files' => array()); 

    $items = scandir($dir); 
    foreach ($items as $item) { 
     if(preg_match($this->_ignore, $item)) { 
      if($this->_force_unignore === false || !preg_match($this->_force_unignore, $item)) { 
       continue; 
      } 
     } 

     $path = $dir . DIRECTORY_SEPARATOR . $item; 
     if (is_dir($path)) { 
      $return['directories'][$item] = $this->_getTree($path); 
      continue; 
     } 

     $return['files'][$item] = $item; 
    } 

    uksort($return['directories'], "strnatcasecmp"); 
    uksort($return['files'], "strnatcasecmp"); 

    return $return['directories'] + $return['files']; 
} 

_getTree()構建的格式通過掃描服務器目錄尋找文件夾和文件如下所示的陣列構建樹形菜單。然後它將該數組傳遞到tree()。我的目標是讓一個函數構建這個相同的樣式數組,但從MySQL數據庫文件夾和記錄記錄中。

任何人都可以幫助我一個函數,可以從2個數據庫表中構建像下面的數組。

我的數據庫表將

  • 筆記本與列名parent表示父文件夾。如果筆記本是父筆記本的子文件夾,則筆記本ID將進入父字段。 0 ==父級文件夾。
  • 筆記parent列被鏈接到筆記本的ID。

任何幫助非常感謝?

Array(
    [top_level_notebook_1] => Array(
      [child_note_of_parent_notebook_1.html] => some_note.html 
      [child_level_notebook_1] => Array(
        [note_1.html] => some_note.html 
      ) 

      [child_level_notebook_2] => Array(
        [note_2] => cache.js 
        [note_3] => cache.js.md 
        [note_4] => Confirmation-Dialog.js 
      ) 

      [child_level_notebook_3] => Array(
        [crud.php] => crud.php 
        [error2mysql.php] => error2mysql.php 
        [upload_file_from_remote_url.php] => upload_file_from_remote_url.php 
      ) 

    ) 

    [top_level_notebook_2] => Array(
      [note_7.html] => some_note.html 
    ) 

    [root_level_note.html] => Dev_Bookmarks.html 
) 
+0

嗯..這是要求對如何構建您的數據庫或一旦你已經完成了如何查詢它的意見? –

+0

@BobNocraz關於如何查詢它。我更新了問題以顯示父列的數據庫結構 – JasonDavis

回答

1

除非你想與您的查詢極其複雜的,我會做一些事情相處的所有記錄,並建設有腳本數組的線條更。事情是這樣的:

腳本現在包括數據庫的東西(更新):

//Change these credentials! 
$mysqli = new mysqli("localhost", "my_user", "my_password", "world"); 

if ($mysqli->connect_errno) { 
    printf("Connect failed: %s\n", $mysqli->connect_error); 
    exit(); 
} 

$query = "SELECT nb.`name` AS 'notebook', no.`name` AS 'note', (SELECT `name` FROM `notebooks` WHERE `id` = nb.`parent`) AS 'nbparent', no.`parent` AS 'noparent' FROM `notebooks` nb RIGHT JOIN `notes` no ON no.`parent` = nb.`id` WHERE (nb.`active` = 1 OR nb.`active` IS NULL) AND (no.`active` = 1 OR no.`active` IS NULL)"; 

$result = $mysqli->query($query); 

$myArray = array(); 

while($row = $result->fetch_assoc()){ 
    if($row['nbparent']){ 
     if($row['note']) $myArray[$row['nbparent']][$row['notebook']][] = $row['note']; 
    } else { 
     if($row['note']) { 
      if($row['notebook']) $myArray[$row['notebook']][] = $row['note']; 
       else $myArray[] = $row['note']; 
     } 

    } 

} 

var_dump($myArray); 

這應該工作!我測試了它在我的本地開發環境,並得到這個結果與一組測試數據:

array (size=4) 
    'Parent Notebook1' => 
    array (size=6) 
     0 => string 'Note1' (length=5) 
     1 => string 'Note2' (length=5) 
     2 => string 'Note5' (length=5) 
     'Child Notebook1' => 
     array (size=1) 
      0 => string 'Note6' (length=5) 
     'Child Notebook2' => 
     array (size=1) 
      0 => string 'Note7' (length=5) 
     'Child Notebook3' => 
     array (size=1) 
      0 => string 'Note8' (length=5) 
    'Parent Notebook2' => 
    array (size=1) 
     0 => string 'Note3' (length=5) 
    'Parent Notebook3' => 
    array (size=1) 
     0 => string 'Note4' (length=5) 
    0 => string 'Note With No Parent :(' (length=22) 

那是什麼做的是通過每個結果循環。當然,您需要將列名稱(如$ row ['notebook'])更改爲您的實際列的名稱。它會工作一層。如果你需要更多,你必須稍微調整一下。不過,這是一般的想法,應該從你的結構中獲得一個數組。

快速注

上面的代碼不會嚴格友好。如果你擔心警告,上面的代碼會給你關於未定義鍵的警告。它會爲你創建它們,因爲我們都已經成長爲對PHP的愛/恨。如果你想保留關鍵的警告,你可以很容易地彈出一些關鍵檢查if(array_key_exists())

潛在的 '疑難雜症'

這部作品的名字。如果您爲「筆記本」使用相同的名稱,我會建議您更進一步,並使用id構建數組,而不是像筆記本的標題那樣的基於文本的列。從那裏,你需要在每個筆記本里面添加一個新的名字。我在製作此腳本時複製了您在示例中提供的數組,但我確實想確保您理解此方法涉及的潛在(令人沮喪)的「陷阱」。

讓我知道如果您有任何問題,希望這有助於。

+0

謝謝,我的數據庫目前只存在於我的腦海中,因此我將設置測試並報告回來。謝謝您的幫助! – JasonDavis

+0

沒問題,希望它有幫助!讓我知道如果這不能很好地解決您的需求,我會編輯我的答案:) –

+0

此圖顯示了我的測試結果... https://www.apollowebstudio.com/screenshots/2016/chrome_2016-02-11_18 -15-22.png和我的樣本數據庫http://pastebin.com/xChA7Btj – JasonDavis

相關問題