array_diff()工作如何?它显然不能按以下方式工作:
array_diff()
function array_diff($arraya, $arrayb) { $diffs = array(); foreach ($arraya as $keya => $valuea) { $equaltag = 0; foreach ($arrayb as $valueb) { if ($valuea == $valueb) { $equaltag =1; break; } } if ($equaltag == o) { $diffs[$keya]=$valuea; } } return $diffs; } //couldn't be worse than this
有谁知道更好的解决方案?
编辑@animuson:
function array_diff($arraya, $arrayb) { foreach ($arraya as $keya => $valuea) { if (in_array($valuea, $arrayb)) { unset($arraya[$keya]); } } return $arraya; }
更新
[请参阅下面的更快/更好的代码。
array_diff的行为在PHP 5.3.4中要好得多,但仍比Leo的函数慢10倍。
还值得注意的是,这些函数并不严格等同于array_diff它们,因为它们不维护数组键,即my_array_diff(x,y) == array_values(array_diff(x,y))。
array_diff
my_array_diff(x,y) == array_values(array_diff(x,y))
/更新
更好的解决方案是使用哈希映射
function my_array_diff($a, $b) { $map = $out = array(); foreach($a as $val) $map[$val] = 1; foreach($b as $val) if(isset($map[$val])) $map[$val] = 0; foreach($map as $val => $ok) if($ok) $out[] = $val; return $out; } $a = array('A', 'B', 'C', 'D'); $b = array('X', 'C', 'A', 'Y'); print_r(my_array_diff($a, $b)); // B, D
基准
function your_array_diff($arraya, $arrayb) { foreach ($arraya as $keya => $valuea) { if (in_array($valuea, $arrayb)) { unset($arraya[$keya]); } } return $arraya; } $a = range(1, 10000); $b = range(5000, 15000); shuffle($a); shuffle($b); $ts = microtime(true); my_array_diff($a, $b); printf("ME =%.4f\n", microtime(true) - $ts); $ts = microtime(true); your_array_diff($a, $b); printf("YOU=%.4f\n", microtime(true) - $ts);
结果
ME =0.0137 YOU=3.6282
任何问题?;)
而且,只是为了好玩,
$ts = microtime(true); array_diff($a, $b); printf("PHP=%.4f\n", microtime(true) - $ts);
ME =0.0140 YOU=3.6706 PHP=19.5980
这是令人难以置信的!