Liz*_*ard 28 php big-o array-unique array-flip
如果我有一个有符号整数数组,例如:
Array
(
[0] => -3
[1] => 1
[2] => 2
[3] => 3
[4] => 3
)
Run Code Online (Sandbox Code Playgroud)
为了获得独特的价值,我本能地使用,array_unique但经过考虑后,我可以执行array_flip两次具有相同效果,我认为会更快?
array_unique O(n log n),因为它使用的排序操作
array_flip 上)
我的假设是否正确?
更新/示例:
$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
)
Run Code Online (Sandbox Code Playgroud)
Ala*_*air 30
你对此的直觉是正确的!
$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";
Run Code Online (Sandbox Code Playgroud)
输出:
Array Unique: 1.1829199790955
Keys Flip: 0.0084578990936279
Flip Flip: 0.0083951950073242
Run Code Online (Sandbox Code Playgroud)
请注意,array_keys(array_flip($array))将按顺序提供新的键值,在许多情况下可能是您想要的(除了快得多之外array_values(array_unique($array))),而键array_flip(array_flip($array))相同的位置相同(除非快得多)array_unique($array).
小智 5
注意:此技术不能直接替代 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',
)
Run Code Online (Sandbox Code Playgroud)
对比:
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',
)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9406 次 |
| 最近记录: |