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]입니다. 하지만 왜? 말이되지 않는 것 같습니다. 나는 배열의 내용을 채워진대로 인쇄했기 때문에 거기에 무언가가 있다는 것을 알고 있습니다. 그러나 루프 중에는 단지 표시되는 것이 아닙니다. 어떤 아이디어?
해결책
약간의 버그 수정 (및 뻔뻔스러운 스타일 변경) : 버전은 확인 된 = "Checked"를 여러 번 인쇄 할 수 있습니다. 하다 $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 승자처럼 보이지만 나는 그것을 생각하지 않았다