phparraysfunctionarray-uniqueasort

Should I use asort after array_unique if the array was asorted before?


$arr = asort($arr);

//some magic code goes here, $arr is not changed

$arr = array_unique($arr);

Should I use asort again to be sure $arr is asorted? My tests show that no, I don't. But I'm not sure for 100% if array_unique actually removes the 2nd+ repeated elements.


Solution

  • You merely want to ensure that asort and array_unique use the same sort_flags.

    By default:

    So you can see that each will sort based on a different algorithm, which might mostly match up, but you want it to explicitly match up. Thus, the smart money is on making a decision like:

    <?php
    $input = array("a" => "green", "red", "b" => "green", "blue", "red");
    asort($input,SORT_REGULAR);
    print_r($input);
    print "\n";
    $result = array_unique($input,SORT_REGULAR);
    print_r($result);
    

    Resulting in:

     Array
    (
        [1] => blue
        [a] => green
        [b] => green
        [2] => red
        [0] => red
    )
    
    Array
    (
        [1] => blue
        [a] => green
        [2] => red
    )
    

    Also note that if you merely run array_unique without the initial asort, you will get different results.

    Finally note that asort supports two flags that array_unique does not support:

    1. SORT_NATURAL - compare items as strings using "natural ordering" like natsort()
    2. SORT_FLAG_CASE - can be combined (bitwise OR) with SORT_STRING or SORT_NATURAL to sort strings case-insensitively

    If you use either of these two in your asort then you would necessarily need to asort again after array_unique.