154

オブジェクトの配列を反復処理し、その'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
        } 
    }
}

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

4

6 に答える 6

259
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]);
        } 
    }
}
于 2010-02-21T02:56:58.600 に答える
3

主な答えに注意してください。

[['id'=>1,'cat'=>'vip']
,['id'=>2,'cat'=>'vip']
,['id'=>3,'cat'=>'normal']

関数を呼び出す

foreach($array as $elementKey => $element) {
    foreach($element as $valueKey => $value) {
        if($valueKey == 'cat' && $value == 'vip'){
            //delete this particular object from the $array
            unset($array[$elementKey]);
        } 
    }
}

戻ります

[2=>['id'=>3,'cat'=>'normal']

それ以外の

[0=>['id'=>3,'cat'=>'normal']

これは、unsetが配列のインデックスを再作成しないためです。

インデックスを再作成します。(必要な場合)

$result=[];
foreach($array as $elementKey => $element) {
    foreach($element as $valueKey => $value) {
        $found=false;
        if($valueKey === 'cat' && $value === 'vip'){
            $found=true;
            $break;
        } 
        if(!$found) {
           $result[]=$element;
        }
    }
}
于 2020-04-18T11:50:38.743 に答える
2

unsetの構文が無効であるように見えます。インデックスの再作成がないと、将来問題が発生する可能性があります。PHP配列に関するセクションを参照 してください。

正しい構文は上に示されています。また、インデックスを再作成するための配列値にも注意してください。これにより、以前に削除したものにインデックスを付けることはありません。

于 2010-02-21T02:58:43.323 に答える
2

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

foreach($array as $elementKey => &$element) {
    // $element is the same than &$array[$elementKey]
    if (isset($element['id']) and $element['id'] == 'searched_value') {
        unset($element);
    }
}
于 2015-06-09T12:17:56.323 に答える
1

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

reset($array);
while (list($elementKey, $element) = each($array)) {
    while (list($key, $value2) = each($element)) {
        if($key == 'id' && $value == 'searched_value') {
            unset($array[$elementKey]);
        }
    }
}
于 2013-02-07T18:54:32.047 に答える
-1

私はあまりphpプログラマーではありませんが、C#では、配列を反復処理している間は配列を変更できないと言えます。foreachループを使用して要素のインデックスを識別したり、削除する要素を特定してから、ループの後に要素を削除したりすることをお勧めします。

于 2010-02-21T02:53:40.150 に答える