私は2つの配列を持っています、配列Aは削除したいいくつかの要素を持つ長いリストを含んでいます。配列Bは、配列Aから削除したい要素の完全なリストです。ある配列のすべての要素を別の配列から削除する最も効率的な方法は何ですか?
これを達成する最も効率的な方法は何ですか?
私は2つの配列を持っています、配列Aは削除したいいくつかの要素を持つ長いリストを含んでいます。配列Bは、配列Aから削除したい要素の完全なリストです。ある配列のすべての要素を別の配列から削除する最も効率的な方法は何ですか?
これを達成する最も効率的な方法は何ですか?
array_diffは明白な答えですが、最も効率的な方法を求めてきたことから、ここでは私のマシン上
$big = range(1, 90000);
$remove = range(500, 600);
$ts = microtime(true);
$result = array_diff($big, $remove);
printf("%.2f\n", microtime(true) - $ts);
$ts = microtime(true);
$map = array_flip($remove);
$result = array();
foreach($big as $e)
if(!isset($map[$e]))
$result[] = $e;
printf("%.2f\n", microtime(true) - $ts);
プリント
0.67
0.03
とそう単純なループテストですハッシュベースのルックアップはarray_diffより約20倍高速です。
manualではarray_dif()このexapleを与える:
<?php
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);
print_r($result);
?>
出力:
Array
(
[1] => blue
)
である配列1からすべての のエントリを含む配列を返します。 が存在しない他の配列。
あなたはいいですね! :) +1 – Trufa
私はメモリの使用やarray_diffがより良い操作を実行する何らかの方法のためにこの答えに反対します...しかし、私は何か正確なことを考えることはできません。 Kudos、今すぐarray_diffを速くするようphp devsに伝えてください。 – Sparr