2011-09-28 5 views
1

에 중첩 된 루프를 중단하는 데 사용시 :문제가이 코드를 실행하면 PHP

$result = mysql_query("SELECT * FROM example_table"); 

$i = 0; 
while ($row = mysql_fetch_array($result)) 
{ 
    for ($j = 0; $j < $c; $j++) 
    { 
     if ($db_array[$j]['ID'] == $row['id']) 
     { 
      $del_counter = 0; 
      break 2; 
     } 
     else 
     $del_counter = 1; 
    } 

    if ($del_counter == 1) 
    { 
    $del_array[$i] = $row['id']; 
    $i++; 
    } 

} 

이 두 가지 수준의 루프를 중단하지 않습니다. 대신 $ del_array는 모든 행 ID를 저장합니다. db_array [] [id]와 (데이터베이스에서 가져온) 배열 "row"를 비교해야합니다. db_array의 어떤 요소가 데이터베이스에서 삭제되었는지 확인해야합니다. 그래서, 내가 한 것은 삭제 된 항목의 ID를 배열에 저장하려고했습니다. 그러나 휴식은 효과가 없습니다. 내가 놓친 게 있니?

미리 감사드립니다. PHP 매뉴얼에 따르면 BG

+0

중첩하기 전에 $ del_counter = 0을 정의하려고합니다. –

+1

무례하게 들리고 싶지는 않지만, 'break 2'는 발표 된대로 작동 할 것이므로 코드에 로직 결함이 있다고 가정합니다. 스텝 디버거를 사용하여 코드가하는 일을 확인하십시오. – hakre

+0

조금 바꾸어 주시겠습니까? 행이 삭제 된 경우 어떻게 검색합니까? – mowwwalker

답변

2

:

1) break ends execution of the current for, foreach, while, do-while or switch structure 
2) break accepts an optional numeric argument which tells it 
how many (the above mentioned) nested enclosing structures are to be broken out of 

귀하의 휴식이 레벨 2, 그리고 예상대로 따라서 break 2; 작동합니다, 그래서 문제가 다른 곳이다. break 2이 전혀 실행됩니까?

어쨌든 더 강력한 솔루션을 추천합니다.

$ok = True; 
while (($row = mysql_fetch_array($result)) && $ok) { 
     ... 
     if (...) $ok = False; // anywhere deep 
     ... 
     if ($ok) {...} 
} 
+0

break foreground, foreach, while, do-while 또는 switch 구조체의 실행을 중단하므로 break 2는 예상대로 작동합니다. – matino

+0

@matino : 맞습니다. 내 대답을 편집했습니다. – Jiri

+0

지리와 마티노 감사합니다. 그러나, 휴식 1 나를 위해 일했습니다. 그 순간에 내가 알 수 없었던 것은 내 편이라는 논리상의 오류였다. – BasicGem

관련 문제