Skip to main content

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
)


Source: Tips4allCCNA FINAL EXAM

Comments

  1. 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.

    ReplyDelete
  2. Nothing is better than running your own benchmark.

    ➜ 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


    Update: Array with 1000 elements.

    ➜ 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


    So yes, your assumption was correct.

    ReplyDelete
  3. you would have to use

    array_keys( array_flip( $array ) );


    which would take more time

    I would go for array_unique. It has the added benefit of explaining whats happening.

    ReplyDelete

Post a Comment

Popular posts from this blog

Slow Android emulator

I have a 2.67 GHz Celeron processor, 1.21 GB of RAM on a x86 Windows XP Professional machine. My understanding is that the Android emulator should start fairly quickly on such a machine, but for me it does not. I have followed all instructions in setting up the IDE, SDKs, JDKs and such and have had some success in staring the emulator quickly but is very particulary. How can I, if possible, fix this problem?