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 )
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.
Caution: this technique is NOT a drop-in replacement for array_unique(). It only works for arrays with values that are are valid keys. (eg: string, integer, things can can be cast to int). And certainly does not work for arrays of objects.
$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', )
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With