foreach
で配列をループして、値が存在するかどうかを確認したい。値が存在する場合、それを含む要素を削除します。
私は次のコードを持っています:
foreach($display_related_tags as $tag_name) {
if($tag_name == $found_tag['name']) {
// Delete element
}
}
値が見つかったら要素を削除する方法がわかりません。どうすれば削除できますか?
この問題にはforeach
を使用する必要があります。おそらくforeach
に代わるものがあり、それらを共有してください。
キーも取得する場合、次のようにしてそのアイテムを削除できます。
foreach ($display_related_tags as $key => $tag_name) {
if($tag_name == $found_tag['name']) {
unset($display_related_tags[$key]);
}
}
より良い解決策は、 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は内部配列ポインターを使用しません。
foreach($display_related_tags as $key => $tag_name)
{
if($tag_name == $found_tag['name'])
unset($display_related_tags[$key];
}
配列に対して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 を確認してください。
この場合、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番目のループでは、最初のループエントリの設定を解除する必要があります。これは、パフォーマンスの目的でイテレーションに再度アクセスすることはできません。
既に述べたように、キーを使用してforeachを実行し、キーを使用して設定を解除する必要がありますが、PHPのルールについてはよくわかりませんが、反復中に配列を変更することは一般的に悪い考えです。オフハンド。
while
、for
サイクルでnext()
、current()
関数を使用してみてください。
設定を解除する方法を明らかにしている回答がすでにあります。すべてのクラスでコードを繰り返すのではなく、次のような関数を作成し、必要なときにコードで使用します。ビジネスロジックでは、一部のプロパティを公開したくない場合があります。削除するには、以下のライナーコールをご覧ください
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);