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

[韓日関係] 首相含む大幅な内閣改造の可能性…早ければ来月10日ごろ=韓国

div not scrolling properly with slimScroll plugin

I am using the slimScroll plugin for jQuery by Piotr Rochala Which is a great plugin for nice scrollbars on most browsers but I am stuck because I am using it for a chat box and whenever the user appends new text to the boxit does scroll using the .scrollTop() method however the plugin's scrollbar doesnt scroll with it and when the user wants to look though the chat history it will start scrolling from near the top. I have made a quick demo of my situation http://jsfiddle.net/DY9CT/2/ Does anyone know how to solve this problem?

Why does this javascript based printing cause Safari to refresh the page?

The page I am working on has a javascript function executed to print parts of the page. For some reason, printing in Safari, causes the window to somehow update. I say somehow, because it does not really refresh as in reload the page, but rather it starts the "rendering" of the page from start, i.e. scroll to top, flash animations start from 0, and so forth. The effect is reproduced by this fiddle: http://jsfiddle.net/fYmnB/ Clicking the print button and finishing or cancelling a print in Safari causes the screen to "go white" for a sec, which in my real website manifests itself as something "like" a reload. While running print button with, let's say, Firefox, just opens and closes the print dialogue without affecting the fiddle page in any way. Is there something with my way of calling the browsers print method that causes this, or how can it be explained - and preferably, avoided? P.S.: On my real site the same occurs with Chrome. In the ex