2012-01-20 17 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

参照はbtwで動作しません。依然としてローカル変数のみになります。 ;) – NikiC

+0

さらに、 'unset($ val)'を 'foreach'ループの後に置いて参照を削除するのがよい方法です(これは答えの最後の段落も忘れてしまいます)。 – hakre

0

を$行は値全体ではなく、構成要素であるため。

試行: foreachの($キー=> $値として$国){ IF($行[ '総'] == 0){ 解除($国[$キー])。 } }