PHPのネストされたループの予期しない動作
-
08-07-2019 - |
質問
特定の記事($ link_cat)のカテゴリを含む配列があります。次に、mysql_fetch_arrayを使用して、利用可能なカテゴリのすべてをチェックボックス付きのリストに出力します。これを実行している間、現在の値を他の配列の値と比較してほしい。一致する場合、カテゴリの1つがこの記事に適用されることを意味し、チェックされた属性を適用するコード行を印刷する必要があります。すばらしいです!動作していないことを除いて= [
while ( $row = mysqli_fetch_array($results, MYSQLI_ASSOC) ){
$cat[$i] = $row['category'];
$cat_id[$i] = $row['cat_id'];
echo '<li><input type="checkbox" ';
$catCount = count($link_cat);
for ($ct = 0; $ct < $catCount; $ct++){
if ($cat_id[$i] == $link_cat[$ct]){
echo 'checked="checked" ';
}
}
echo 'name="' . $cat_id[$i] . '" />' . $cat[$i] . '</li>';
$i++;
}
以前にネストされたループを実際に実行したことはありません(これが問題だと思われます)。
問題は、これが実行されると、チェックする最初のカテゴリを持つ$ link_cat [0]が登録されないことです。空白になります。 forループ内で変数を出力すると、これが確認されました。その他[1] [2]などは問題ありません。それはただ[0]です。しかし、なぜ?意味をなさないようです。そこに何かがあることを知っています。なぜなら、配列の内容を記入したとおりに印刷したからです。しかし、ループ中に表示されるだけではありません。アイデアはありますか?
解決
わずかなバグ修正(および露骨なスタイル変更):バージョンは、checked =&quot; checked&quot;を印刷できます。複数回。 $ cat
と $ cat_id
は配列にする必要がありますか?
while ( $row = mysqli_fetch_array($results, MYSQLI_ASSOC) ) {
$cat = $row['category'];
$cat_id = $row['cat_id'];
echo '<li><input type="checkbox" ';
if ( in_array($cat_id, $link_cat) ) {
echo 'checked="checked" ';
}
echo "name='$cat_id' />$cat</li>";
}
通常、問題が発生したときにデバッガーを投げるような状況では、素敵な print_r (デバッグ出力の表示ソース、ライブっぽいサイトで安全)。
echo '<!-- ' . print_r($link_cat, TRUE) . ' -->';
他のヒント
もともとリセットが必要な配列のループについては非常に間違っていましたが、その配列をループすることはあなたが望んでいることをする最速の方法ではないという感覚を揺るがすことはできません。
おそらく array_search が実行するか、または array_key_exists 。 in_array は勝者のように見えますが、私は考えていませんでしたそれ