2009-03-10 2 views
0

У меня есть массив, который содержит категории для определенной статьи ($ link_cat). Затем я использую mysql_fetch_array для печати всех категорий, доступных в списке с флажками. Пока он делает это, я хочу, чтобы он сравнивал значение, на котором оно установлено, со значением из другого массива. Если есть совпадение, то это означает, что одна из категорий относится к этой статье, и она должна распечатать строку кода, чтобы применить проверенный атрибут. Великий! за исключением того, что не работает = [PHP вложенная петля, ведущая себя неожиданно

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]. Но почему? это, кажется, не имеет никакого смысла. Я знаю, что там что-то есть, потому что я напечатал содержимое массива, когда я его заполнил, просто чтобы проверить. Тем не менее, он не просто отображается во время цикла. Есть идеи?

+0

Можете ли вы показать код, который заполняет $ link_cat? – mbeckish

+0

Согласен, что, скорее всего, будет проблема. –

+0

Вы инициализировали $ i равным нулю перед входом в цикл while? –

ответ

10

небольшое исправление ошибки (и вопиющее изменение стиля): Ваша версия может распечатывать checked = "checked" несколько раз. Do $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) . ' -->'; 
+0

Спасибо, друг, очень ценится. Твой путь был намного лучше, я учусь :) – Jon

0

В то время как я был изначально очень ошибочным в отношении цикла цикла, нуждающегося в сбросе, я не могу поколебать ощущение, что цикл через этот массив - это не самый быстрый способ сделать то, что вам нужно.

Возможно, array_search сделал бы, или, может быть, array_key_exists. in_array выглядит как победитель, но я не думал об этом

+0

Доступ к нему по индексу, reset() не требуется. –

+0

Я понимаю. Я удалю тупую часть моего ответа. – MrChrister

 Смежные вопросы

  • Нет связанных вопросов^_^