如何和array_diff工作? [英] How does array_diff work?
问题描述
如何和array_diff()
工作?显然,它不工作如下:
函数和array_diff($ arraya,$ arrayb)
{
$的diff =阵列();
的foreach($ arraya为$科亚=> $值a)
{
$ equaltag = 0;
的foreach($ arrayb为valueB,则$)
{
如果($值a == $ valueB,则)
{
$ equaltag = 1;
打破;
}
}
如果($ equaltag == O)
{
$ diff文件[$科亚] = $值a;
} }
返回$比较;
} //不能比这更糟糕
有谁知道一个更好的解决方案?
编辑@animuson:
函数和array_diff($ arraya,$ arrayb)
{
的foreach($ arraya为$科亚=> $值a)
{
如果(in_array($值a,$ arrayb))
{
未设置($ arraya [$科亚]);
}
}
返回$ arraya;
}
更新
-
见下文更快/更code。
-
和array_diff行为是在PHP 5.3.4好多了,但还是比〜狮子座的功能慢10倍。
-
还值得注意的是,这些功能都没有严格等同于
和array_diff
,因为它们不维护数组键,即my_array_diff( X,Y)== array_values(和array_diff(X,Y))
。
/ UPDATE
一个更好的解决方案是使用哈希地图
函数my_array_diff($ A,$ B){
$图= $ OUT =阵列();
的foreach($ A $为VAL)$图[$ VAL] = 1;
的foreach($ B为$ VAL)如(使用isset($地图[$ VAL))$地图[$ VAL] = 0;
的foreach($地图为$ VAL => $ OK)如果($ OK)$出来[] = $ VAL;
返回$出;
}$ A =阵列('A','B','C','D');
$ B =阵列('X','C','A','Y');的print_r(my_array_diff($ A,$ B)); // B,D
基准
函数your_array_diff($ arraya,$ arrayb)
{
的foreach($ arraya为$科亚=> $值a)
{
如果(in_array($值a,$ arrayb))
{
未设置($ arraya [$科亚]);
}
}
返回$ arraya;
}$ A =范围(1,10000);
$ B =范围(5000,15000);洗牌($ A);
洗牌($ B);$ TS = microtime中(真);
my_array_diff($ A,$ B);
的printf(ME =%4F \\ n,microtime中(真) - $ TS);$ TS = microtime中(真);
your_array_diff($ A,$ B);
的printf(你=%4F \\ n,microtime中(真) - $ TS);
结果
ME = 0.0137
YOU = 3.6282
什么问题吗? ;)
和,只是为了好玩,
$ TS = microtime中(真);
和array_diff($ A,$ B);
的printf(PHP =%4F \\ n,microtime中(真) - $ TS);
结果
ME = 0.0140
YOU = 3.6706
PHP = 19.5980
这是令人难以置信!
How does array_diff()
work? It obviously couldn't work as follows:
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
Does anyone know a better solution?
EDIT @animuson:
function array_diff($arraya, $arrayb)
{
foreach ($arraya as $keya => $valuea)
{
if (in_array($valuea, $arrayb))
{
unset($arraya[$keya]);
}
}
return $arraya;
}
UPDATE
see below for faster/better code.
array_diff behaviour is much better in php 5.3.4, but still ~10 times slower than Leo's function.
also it's worth noting that these functions are not strictly equivalent to
array_diff
since they don't maintain array keys, i.e.my_array_diff(x,y) == array_values(array_diff(x,y))
.
/UPDATE
A better solution is to use hash maps
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
benchmark
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);
result
ME =0.0137
YOU=3.6282
any questions? ;)
and, just for fun,
$ts = microtime(true);
array_diff($a, $b);
printf("PHP=%.4f\n", microtime(true) - $ts);
result
ME =0.0140
YOU=3.6706
PHP=19.5980
that's incredible!
这篇关于如何和array_diff工作?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!