web-dev-qa-db-ja.com

foreachループ内の配列からオブジェクトを削除する方法は?

オブジェクトの配列を反復処理し、その 'id'プロパティに基づいてオブジェクトの1つを削除したいのですが、コードが機能しません。

foreach($array as $element) {
    foreach($element as $key => $value) {
        if($key == 'id' && $value == 'searched_value'){
            //delete this particular object from the $array
            unset($element);//this doesn't work
            unset($array,$element);//neither does this
        } 
    }
}

助言がありますか。ありがとう。

128
ababa
foreach($array as $elementKey => $element) {
    foreach($element as $valueKey => $value) {
        if($valueKey == 'id' && $value == 'searched_value'){
            //delete this particular object from the $array
            unset($array[$elementKey]);
        } 
    }
}
206
prodigitalson

foreach値で参照を使用することもできます。

foreach($array as $elementKey => &$element) {
    // $element is the same than &$array[$elementKey]
    if (isset($element['id']) and $element['id'] == 'searched_value') {
        unset($element);
    }
}
2
air-dex

Unsetの構文は無効であり、インデックスの再作成がないため、今後問題が発生する可能性があります。参照: PHP配列のセクション

正しい構文は上記に示されています。また、 array-values を再インデックス付けするため、以前に削除したものにインデックスを作成することはありません。

1
pablo.meier

これでうまくいくはずです.....

reset($array);
while (list($elementKey, $element) = each($array)) {
    while (list($key, $value2) = each($element)) {
        if($key == 'id' && $value == 'searched_value') {
            unset($array[$elementKey]);
        }
    }
}
1
Josh

私はPHPプログラマーではありませんが、C#では、配列を繰り返し処理している間は配列を変更できないと言えます。 foreachループを使用して、要素のインデックス、または削除する要素を特定し、ループ後に要素を削除してみてください。

0
Corey Sunwold