0

私は次のコードを持っています:

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

2つの列idには、次のcategoryようなデータが含まれています。

  • id | カテゴリー
  • 1 | 靴
  • 2 | シャツ
  • 3 | 帽子

私がやりたいのは、テーブル内のすべての行categoriesをというローカル変数に変換することです。cats

whileループでは、各行の配列キーがカテゴリIDになり、カテゴリ名がキーに割り当てられるため、ローカル配列が生成されます。var_dump($cats)は、私が説明したように、各行が変数に追加されることを示しています。

しかし、foreachでは、何らかの理由で、各IDが新しい行として返されましたが、カテゴリの名前は、すべてのキーにわたって、最後の可能なカテゴリ名として表示されます。

変数のダンプが1セットのデータを示しているのに、その内容のこのように印刷されたループがこの奇妙な問題を示しているのはなぜですか?

このような:

  • 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>
    ";
}
4

2 に答える 2

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>";
}
于 2012-04-22T13:44:22.143 に答える
2

コードは問題ないようです。whileループの後で$cats配列でvar_dumpを試しましたか?この行が問題を引き起こしているのではないかと思います

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

あなたはおそらくそれを変更する必要があります

foreach ($cats as $catKey => $catDetails)
{
    $catName = $catDetails['catName'];
    $pageContent .= "<p>$catKey | $catName</p>";
}
于 2012-04-22T13:44:50.510 に答える