回答:
シンプルなワンライナーで実現できます。
この配列を持つ:
$arr = array('nice_item', 'remove_me', 'another_liked_item', 'remove_me_also');
できるよ:
$arr = array_diff($arr, array('remove_me', 'remove_me_also'));
の値は$arr
次のとおりです。
array('nice_item', 'another_liked_item')
美しいコードを書くのに役立つことを願っています。
array_diff
関数は新しい配列を返し、非破壊です。
$referenced = array_diff($referenced, $items_to_remove);
2つ目の答えを追加します。ここでさまざまな方法を試すための簡単なベンチマークスクリプトを作成しました。
$arr = array(0 => 123456);
for($i = 1; $i < 500000; $i++) {
$arr[$i] = rand(0,PHP_INT_MAX);
}
shuffle($arr);
$arr2 = $arr;
$arr3 = $arr;
/**
* Method 1 - array_search()
*/
$start = microtime(true);
while(($key = array_search(123456,$arr)) !== false) {
unset($arr[$key]);
}
echo count($arr). ' left, in '.(microtime(true) - $start).' seconds<BR>';
/**
* Method 2 - basic loop
*/
$start = microtime(true);
foreach($arr2 as $k => $v) {
if ($v == 123456) {
unset($arr2[$k]);
}
}
echo count($arr2). 'left, in '.(microtime(true) - $start).' seconds<BR>';
/**
* Method 3 - array_keys() with search parameter
*/
$start = microtime(true);
$keys = array_keys($arr3,123456);
foreach($keys as $k) {
unset($arr3[$k]);
}
echo count($arr3). 'left, in '.(microtime(true) - $start).' seconds<BR>';
array_keys()
オプションの検索パラメーターを指定した3番目の方法は、群を抜いて最良の方法のようです。出力例:
499999 left, in 0.090957164764404 seconds
499999left, in 0.43156313896179 seconds
499999left, in 0.028877019882202 seconds
これを判断すると、私が使用するソリューションは次のようになります。
$keysToRemove = array_keys($items,$id);
foreach($keysToRemove as $k) {
unset($items[$k]);
}
どうですか:
if (($key = array_search($id, $items)) !== false) unset($items[$key]);
または複数の値の場合:
while(($key = array_search($id, $items)) !== false) {
unset($items[$key]);
}
これにより、の副作用であるキーの損失も防ぐことができますarray_flip()
。
最も強力なソリューションはを使用array_filter
することです。これにより、独自のフィルタリング関数を定義できます。
しかし、あなたの状況では、それは少しやり過ぎだと言う人もいます...
配列を通過し、不要
なforeach
項目を削除する単純なループで十分です。
あなたの場合、このような何かがおそらくトリックをするはずです:
foreach ($items as $key => $value) {
if ($value == $id) {
unset($items[$key]);
// If you know you only have one line to remove, you can decomment the next line, to stop looping
//break;
}
}
array_search()を試してください
array_keys()
を実行しarray_search()
、このタスクよりもパフォーマンスが良いようです。
ソリューションは、配列に一意の値がある場合にのみ機能します
見る:
<?php
$trans = array("a" => 1, "b" => 1, "c" => 2);
$trans = array_flip($trans);
print_r($trans);
?>
より良い方法は、必要に応じてループでarray_searchを使用して設定を解除することです。
この操作にはarray_splice関数を使用できますRef:array_splice
array_splice($array, array_search(58, $array ), 1);