phpbig-oarray-uniquearray-flip

array_unique vs array_flip


If I had an array of signed integers e.g:

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

To get unique values I would instinctively use array_unique but after consideration I could perform array_flip twice which would have the same effect, and I think it would be quicker?

array_unique O(n log n) because of the sort operation it uses

array_flip O(n)

Am I correct in my assumptions?

UPDATE / EXAMPLE:

$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
)

Solution

  • I benchmarked it for you: CodePad

    Your intuition on this was correct!

    $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";
    

    Output:

    Array Unique: 1.1829199790955
    Keys Flip: 0.0084578990936279
    Flip Flip: 0.0083951950073242
    

    Note that array_keys(array_flip($array)) will give a new key values in order, which in many cases may be what you want (identical except much faster to array_values(array_unique($array))), whereas array_flip(array_flip($array)) is identical (except much faster) to array_unique($array) where the keys remain the same.