PHP - 把一个mysql数组的结果变成一个局部变量数组?

问题描述:

我有以下代码: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> 
    "; 
} 

正如您已经构建了数组,你必须做你的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

你的代码看起来没问题。你在while循环之后在你的$ cats数组上试过var_dump了吗?我怀疑这条线是造成你的问题

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

你或许应该改变它OT

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