PHP - 将 mysql 结果数组转换为局部变量数组


PHP - Turning an array of mysql results into a local variable array?

我有以下代码:

$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>";
}

你的代码看起来不错。您是否在 while 循环后尝试过在 $cats 阵列上var_dump?我怀疑这条线给你带来了问题

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

你可能应该改变它

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