PHP вложенный цикл ведет себя неожиданно
-
08-07-2019 - |
Вопрос
У меня есть массив, который содержит категории для конкретной статьи ($ link_cat). Затем я использую mysql_fetch_array для распечатки всех категорий, доступных в списке, с флажками. Пока он делает это, я хочу сравнить его значение со значением из другого массива. Если есть совпадение, то это означает, что к этой статье относится одна из категорий, и она должна распечатать строку кода, чтобы применить проверенный атрибут. отличный! кроме того, что это не работает = [
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]. Но почему? это не имеет никакого смысла. Я знаю, что там что-то есть, потому что я напечатал содержимое массива, когда я его заполнил, просто чтобы проверить. Тем не менее, это не просто показать во время цикла. Есть идеи?
Решение
Небольшое исправление ошибки (и вопиющее изменение стиля): ваша версия может распечатать проверил = " проверил " многократно. Должны ли $ 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 выглядит победителем, но я не думал о это