array_unique与array_flip

2022-08-30 14:56:19

如果我有一个有符号整数数组,例如:

Array
(
    [0] => -3
    [1] => 1
    [2] => 2
    [3] => 3
    [4] => 3
)

为了获得唯一值,我会本能地使用,但经过考虑,我可以执行两次,这将具有相同的效果,我认为这会更快吗?array_uniquearray_flip

array_uniqueO(n log n), 因为它使用的排序操作

array_flipO(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
)

答案 1

我为您进行了基准测试: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)


答案 2

注意:此技术不能直接替代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',
)

与:

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',
)

推荐