2012-04-22 117 views
0

我有以下代碼:PHP - 把一個mysql數組的結果變成一個局部變量數組?

$catsQuery = " 
     SELECT id, category 
     FROM categories 
     ORDER BY category 
"; 
$catsSql = mysqli_query($link, $catsQuery); 

$cats = array(); 

mysqli_data_seek($catsSql, 0); 
while($rowCats = mysqli_fetch_assoc($catsSql)) 
{ 
    $cats[$rowCats['id']]['catName'] = $rowCats['category']; 
} 

foreach ($cats as $catKey => $cat['$catName']) 
{ 
    $pageContent .= "<p>$catKey | $catName</p> 
    "; 
} 

兩列idcategory包含這樣的數據:

  • ID |類別
  • 1 |鞋子
  • 2 |襯衫
  • 3 |帽子

我想什麼做的是把該表中的所有categories行到名爲cats

在while循環中的局部數組作爲各行陣列鍵變爲產生一個局部變量類別ID,然後將類別名稱分配給密鑰。 var_dump($cats)顯示每行都被添加到變量中,正如我所描述的那樣。

但在foreach中,由於某種原因,每個id返回一個新行,但類別的名稱顯示爲最後一個可能的類別名稱,跨所有鍵。

爲什麼變量上的轉儲顯示一組數據,但以這種內容的方式打印的循環顯示了這種奇怪的呃逆?

像這樣:

  • 1 |帽子
  • 2 |帽子
  • 3 |帽子

如果任何人都可以闡明我在做什麼錯誤導致這一點,這將不勝感激。

謝謝!

編輯:

如下的回答後創立的功能代碼:

//categories to local array 
$catsQuery = " 
    SELECT id, category, catDirPath 
    FROM categories 
    ORDER BY category 
"; 
$catsSql = mysqli_query($link, $catsQuery); 
$cats = array(); 
mysqli_data_seek($catsSql, 0); 
while($rowCats = mysqli_fetch_assoc($catsSql)) 
{ 
    $cats[$rowCats['id']]['catName'] = $rowCats['category']; 
    $cats[$rowCats['id']]['catPath'] = $rowCats['catDirPath']; 
} 
// subCats to local array 
$subsQuery = " 
    SELECT id, subCat, category_id, subDirPath 
    FROM subCats, sub_categories 
    WHERE subCats.id = sub_categories.sub_id 
    ORDER BY category_id 
"; 
$subsSql = mysqli_query($link, $subsQuery); 
$subs = array(); 
mysqli_data_seek($subsSql, 0); 
while($rowSubs = mysqli_fetch_assoc($subsSql)) 
{ 
    $subs[$rowSubs['id']]['subName'] = $rowSubs['subCat']; 
    $subs[$rowSubs['id']]['catId'] = $rowSubs['category_id']; 
    $subs[$rowSubs['id']]['subPath'] = $rowSubs['subDirPath']; 
} 
// loop through categories and if subs exist, add to resultset and display 
foreach ($cats as $catId => $cat) 
{ 
    $pageContent .= " 
    <div style='margin-bottom: 10px; border black solid 1px;'> 
    <ul> 
    <li style='list-style-type: none; margin-bottom: 5px;'><a href='$docPath/category/{$cat['catPath']}/'>{$cat['catName']}</a></li> 
    "; 
    foreach ($subs as $subId => $sub) 
    { 
     if($sub['catId'] == $catId) 
     { 
     $pageContent .= " 
     <li style='list-style-type: circle; padding-left: 15px; font-size: 70%;'><a href='$docPath/category/{$cat['catPath']}/{$sub['subPath']}/'>{$sub['subName']}</a></li> 
     "; 
     } 
    } 
    $pageContent .= " 
    </ul> 
    </div> 
    "; 
} 

回答

2

正如您已經構建了數組,你必須做你的foreach循環是這樣的:

foreach ($cats as $catId => $cat) 
{ 
    $pageContent .= "<p>$catKey | ".$cat['catName']."</p>"; 
} 

但爲什麼不只是$cats[$rowCats['id'] = $rowCats['category'];在第一位呢? 然後這就足夠了:

foreach ($cats as $catId => $catName) 
{ 
    $pageContent .= "<p>$catKey | $catName</p>"; 
} 
+0

感謝您的輸入,出興趣的緣故,PHP允許你這樣做:'$ pageContent。 =「

$ catKey | {$ cat ['catName']}

」;' – 2012-04-22 14:14:08

+0

是的,但我不喜歡它,它變得如此不可讀,並且對我來說有太多的「黑魔法」:)我保留我的代碼乾淨且可預測 – 2012-04-22 14:37:39

+0

請參閱作爲答案的結果添加到我的操作中的代碼:)骨架在那裏,我現在可以使用它!非常感謝!! – 2012-04-22 20:42:09

2

你的代碼看起來沒問題。你在while循環之後在你的$ cats數組上試過var_dump了嗎?我懷疑這條線是造成你的問題

foreach ($cats as $catKey => $cat['$catName']) 

你或許應該改變它OT

foreach ($cats as $catKey => $catDetails) 
{ 
    $catName = $catDetails['catName']; 
    $pageContent .= "<p>$catKey | $catName</p>"; 
} 
相關問題