2014-08-28 102 views
0

我有一個從2個LEFT JOIN的MYSQL查詢返回的數組。 問題是:「是否有另一種編寫下面代碼的方法?」。我得到了代碼,但我想要一個更清楚的方法來了解它會發生什麼。從MySQL查詢重新排列數組

CODE:

$result = array(); 
    while ($resultArr = mysqli_fetch_assoc($booksAndAuthors)) { 
     $result[$resultArr['book_id']] ['book_name'] = $resultArr['book_title']; 
     $result[$resultArr['book_id']] ['author'][] = $resultArr['author_name']; 
     print_r($result); 
    } 
+0

你可能不希望循環內部有'print_r'。整個循環完成後,您應該打印它。 – Barmar 2014-08-28 21:19:19

+0

請發表您的查詢。這可能可以通過GROUP和GROUP_CONCAT來解決。 – Tom 2014-08-28 21:19:25

+0

@Tom如果他使用'GROUP_CONCAT',他將需要在提取循環中使用'explode()'將其變成一個數組。他的代碼更好,恕我直言。 – Barmar 2014-08-28 21:20:11

回答

0

使用extract()函數可以將結果中的數據變爲變量。我把下面的例子放在一個函數中,所以它們將是局部變量。

function getBooksAndAuthors($queryResult) 
{ 
    while ($data = mysqli_fetch_assoc($queryResult)) 
    { 
    extract($data); 
    $BooksAndAuthors[$book_id] = array('book_name' => $book_title, 
             'author' => $author_name); 
    } 
    return $BooksAndAuthors; 
} 

這使得代碼更具可讀性。當然,您必須知道數據庫表中有哪些列。我也爲作者省去了額外的'[]'。

+0

這不會創建一個作者數組,它只是返回組中的最後一個作者。 – Barmar 2015-09-26 22:27:45

0

這裏是我建議如何寫它,因爲我不認爲你應該依賴於自動創建中間陣列。

$result = array(); 
while ($row = mysqli_fetch_assoc($booksAndAuthors) { 
    $bookid = $row['book_id']; 
    if (!isset($result[$bookid])) { 
     # First time we see this book, create a result for it 
     $result[$bookid] = array('book_name' => $row['book_title'], 
           'author' => array()); 
    } 
    # add this author to the result entry for the book 
    $result[$bookid]['author'][] = $row['author_name']; 
} 

它基本上是等價的,但我認爲它也使得邏輯更清晰。

+0

謝謝!這讓我更加清楚,我同意! – noSpoon 2014-08-29 06:24:59