如果我有一个有符号整数数组,例如:
Array
(
[0] => -3
[1] => 1
[2] => 2
[3] => 3
[4] => 3
)
为了获得独特的价值,我会本能地使用array_unique
,但在考虑后我可以执行两次array_flip
会产生相同的效果,我认为会更快?
array_unique
O(n log n),因为它使用的排序操作
array_flip
O(n)
我的假设是否正确?
更新/示例:
$intArray1 = array(-4,1,2,3);
print_r($intArray1);
$intArray1 = array_flip($intArray1);
print_r($intArray1);
$intArray1 = array_flip($intArray1);
print_r($intArray1);
Array
(
[0] => -3
[1] => 1
[2] => 2
[3] => 3
[4] => 3
)
Array
(
[-3] => 0
[1] => 1
[2] => 2
[3] => 4
)
Array
(
[0] => -3
[1] => 1
[2] => 2
[4] => 3
)
答案 0 :(得分:29)
我为你做了基准测试:CodePad
你对此的直觉是正确的!
$test=array();
for($run=0; $run<1000; $run++)
$test[]=rand(0,100);
$time=microtime(true);
for($run=0; $run<100; $run++)
$out=array_unique($test);
$time=microtime(true)-$time;
echo 'Array Unique: '.$time."\n";
$time=microtime(true);
for($run=0; $run<100; $run++)
$out=array_keys(array_flip($test));
$time=microtime(true)-$time;
echo 'Keys Flip: '.$time."\n";
$time=microtime(true);
for($run=0; $run<100; $run++)
$out=array_flip(array_flip($test));
$time=microtime(true)-$time;
echo 'Flip Flip: '.$time."\n";
输出:
Array Unique: 1.1829199790955
Keys Flip: 0.0084578990936279
Flip Flip: 0.0083951950073242
请注意,array_keys(array_flip($array))
会按顺序提供新的键值,这在很多情况下可能是您想要的(相同的除了array_values(array_unique($array))
更快),而array_flip(array_flip($array))
是相同的(除了更快更快到array_unique($array)
,其中键保持不变。
答案 1 :(得分:3)
没有什么比运行自己的基准更好了。
➜ 8321620 cat first.php
<?php
$arr = array(-3, 1, 2, 3, 3);
for($i = 0; $i <= 1000000; $i++) {
array_unique($arr);
}
➜ 8321620 time php first.php
php first.php 3.24s user 0.01s system 99% cpu 3.251 total
➜ 8321620 cat second.php
<?php
$arr = array(-3, 1, 2, 3, 3);
for($i = 0; $i <= 1000000; $i++) {
array_flip(array_flip($arr));
}
➜ 8321620 time php second.php
php second.php 1.50s user 0.01s system 99% cpu 1.514 total
更新:包含1000个元素的数组。
➜ 8321620 cat first.php
<?php
$arr = array();
for($i = 0; $i <= 1000; $i++) {
$arr[] = rand(0, 1000);
}
for($i = 0; $i <= 10000; $i++) {
array_unique($arr);
}
➜ 8321620 time php first.php
php first.php 27.50s user 0.03s system 99% cpu 27.534 total
➜ 8321620 cat second.php
<?php
$arr = array();
for($i = 0; $i <= 1000; $i++) {
$arr[] = rand(0, 1000);
}
for($i = 0; $i <= 10000; $i++) {
array_flip(array_flip($arr));
}
➜ 8321620 time php second.php
php second.php 1.59s user 0.01s system 99% cpu 1.604 total
是的,你的假设是正确的。
答案 2 :(得分:3)
警告:此技术不是array_unique()的替代品。它仅适用于值为有效键的数组。 (例如:字符串,整数,东西可以转换为int)。当然不适用于对象数组。
$input = [true, false, 1, 0, 1.2, "1", "two", "0"];
var_export(array_unique($input));
array (
0 => true,
1 => false,
3 => 0,
4 => 1.2,
6 => 'two',
)
VS
var_export(array_keys(array_flip($input)));
PHP Warning: array_flip(): Can only flip STRING and INTEGER values!
in php shell code on line 1
array (
0 => 1,
1 => 0,
2 => 'two',
)
答案 3 :(得分:-2)
你必须使用
array_keys( array_flip( $array ) );
需要更多时间
我会选择array_unique
。它还有解释最新情况的好处。