2012-01-20 3 views
7

나는 각 국가의 이름과 내 웹 사이트에 등록 된 총 사용자 수를 포함하는 간단한 배열을 가지고 있습니다. 다음과 같은 내용입니다.foreach 루프 내에서 배열 요소 삭제하기

Array (
    [1] => Array ([name] => Afghanistan [total] => 3) 
    [2] => Array ([name] => Albania [total] => 0) 
) 

그리고 0 명의 사용자가있는 배열 요소 (국가)를 삭제하려고합니다.

나는이 코드를 시도하고 그것은 작동하지 않습니다 :

foreach($country as $row) { 
    if ($row['total'] == 0) { 
     unset($row); 
    } 
} 

이 코드에 어떤 문제가 있습니까?

+2

가능한 중복 [당신이 foreach 루프에서 배열 요소를 제거하려면 어떻게합니까?] (http://stackoverflow.com/questions/1949259/how-do-you-remove-an-array-element -in-a-foreach-loop) – 7hi4g0

답변

24

unset($row) 경우 로컬 변수 만 제거합니다.

대신 키를 가져오고 그것을 제거 :

foreach ($country as $i => $row) { 
    if ($row['total'] == 0) { 
     unset($country[$i]); 
    } 
} 
+0

효과가있었습니다. 당신의 도움을 주셔서 감사합니다. –

+0

하지만 '$ row' (참조로 전달) 전에'& '기호를 추가하면 어떻게 될까요? – Houssni

3

의 Foreach 배열의 키/값의 복사본 당신이, 이상 반복 그래서 당신은 로컬 복사본을 설정 해제됩니다하고있는 모든 아닌 것 생성 원래 그 배열에있는 원본. 어느 배열 직접

foreach($country as $key => $row) { 
    if ($row['total'] == 0) { 
    unset($country[$key]); 
    } 
} 

액세스 또는 참조를 사용하고 그 해제 후에 필터 NULL 요소 : $ 행 값이 아닌 전체 요소

foreach($country as &$row) { 
    if ($row['total'] == 0) { 
     $row = (unset) $row; 
    } 
} 
unset($row); 
$country = array_filter($country); 
+2

참조가 작동하지 않습니다. 여전히 로컬 변수 일뿐입니다. ;) – NikiC

+0

또한 참조를 제거하기 위해'foreach' 루프 다음에'unset ($ val)'을 두는 것이 좋습니다. 이것은 답의 마지막 단락도 남겨 둡니다. – hakre

0

때문에.

보십시오 의 foreach ($로서 $ 나라 키 => $ 값) { 경우 ($ 행 [ '전체'] == 0) { 해제 ($ 나라 [$ 키]); } }의

관련 문제