web-dev-qa-db-ja.com

foreachループで配列要素を削除するにはどうすればよいですか?

foreachで配列をループして、値が存在するかどうかを確認したい。値が存在する場合、それを含む要素を削除します。

私は次のコードを持っています:

foreach($display_related_tags as $tag_name) {
    if($tag_name == $found_tag['name']) {
        // Delete element
    }
}

値が見つかったら要素を削除する方法がわかりません。どうすれば削除できますか?

この問題にはforeachを使用する必要があります。おそらくforeachに代わるものがあり、それらを共有してください。

111
ajsie

キーも取得する場合、次のようにしてそのアイテムを削除できます。

foreach ($display_related_tags as $key => $tag_name) {
    if($tag_name == $found_tag['name']) {
        unset($display_related_tags[$key]);
    }
}
192
Gumbo

より良い解決策は、 array_filter 関数を使用することです:

$display_related_tags =
    array_filter($display_related_tags, function($e) use($found_tag){
        return $e != $found_tag['name'];
    });

Php documentation が読むように:

ForeachはPHP 5の内部配列ポインターに依存しているため、ループ内で変更すると予期しない動作が発生する可能性があります。

PHP 7では、foreachは内部配列ポインターを使用しません。

30
Neils
foreach($display_related_tags as $key => $tag_name)
{
    if($tag_name == $found_tag['name'])
        unset($display_related_tags[$key];
}
9
Steve H

配列に対してforeach()ループを実行する代わりに、array_search()を使用して適切なキーを見つける方が高速です。小さい配列では、読みやすくするためにforeachを使用しますが、より大きな配列、または頻繁に実行されるコードの場合、これはもう少し最適です。

$result=array_search($unwantedValue,$array,true);
if($result !== false) {
  unset($array[$result]);   
}

Array_search()は$ unwantedValueのインデックスとして0を返すことができるため、厳密な比較演算子!==が必要です。

また、上記の例では、$ unwantedValueが$ arrayで複数回発生する可能性がある場合、最初の値$ unwantedValueのみを削除します。array_keys()を使用してすべてを検索する必要があります。

$result=array_keys($array,$unwantedValue,true)
foreach($result as $key) {
  unset($array[$key]);
}

詳細については、 http://php.net/manual/en/function.array-search.php を確認してください。

6
PiotrN

この場合、foreach配列から複数の値を削除する必要があるシナリオがある場合は、それぞれに対して参照渡しで値を渡す必要があります。このシナリオを説明します。

foreach ($manSkuQty as $man_sku => &$man_qty) {

               foreach ($manufacturerSkus as $key1 => $val1) {

  // some processing here and unset first loops entries                     
 //  here dont include again for next iterations
                           if(some condition)
                            unset($manSkuQty[$key1]);

                        }
               }
}

2番目のループでは、最初のループエントリの設定を解除する必要があります。これは、パフォーマンスの目的でイテレーションに再度アクセスすることはできません。

0

既に述べたように、キーを使用してforeachを実行し、キーを使用して設定を解除する必要がありますが、PHPのルールについてはよくわかりませんが、反復中に配列を変更することは一般的に悪い考えです。オフハンド。

0
Ciarán Walsh

whileforサイクルでnext()current()関数を使用してみてください。

0
pliashkou

設定を解除する方法を明らかにしている回答がすでにあります。すべてのクラスでコードを繰り返すのではなく、次のような関数を作成し、必要なときにコードで使用します。ビジネスロジックでは、一部のプロパティを公開したくない場合があります。削除するには、以下のライナーコールをご覧ください

public static function removeKeysFromAssociativeArray($associativeArray, $keysToUnset)
{
    if (empty($associativeArray) || empty($keysToUnset))
        return array();

    foreach ($associativeArray as $key => $arr) {
        if (!is_array($arr)) {
            continue;
        }

        foreach ($keysToUnset as $keyToUnset) {
            if (array_key_exists($keyToUnset, $arr)) {
                unset($arr[$keyToUnset]);
            }
        }
        $associativeArray[$key] = $arr;
    }
    return $associativeArray;
}

のような呼び出し:

removeKeysFromAssociativeArray($arrValues, $keysToRemove);
0
Somnath Muluk