phparrayssortingassociative-arraycustom-sort

How to sort an associative array into alternative largest smallest order?


Does anyone know how to sort an associative array into alternating largest smallest values? In other words, the odd positioned element (1st, 3rd, 5th, etc) should be ordered descending and the even positioned elements (2nd, 4th, 6th, etc) should be ordered ascending.

I.E.

array("A"=>10, "B"=>2, "C"=>5, "D"=>1, "E"=>30, "F"=>1, "G"=>7)

Should become:

array("E"=>30, "D"=>1, "A"=>10, "F"=>1, "G"=>7, "B"=>2, "C"=>5)

Solution

  • Based on the answer to your previous version of this question:

    $myArray = array("A"=>10, "B"=>2, "C"=>5, "D"=>1, "E"=>30, "F"=>1, "G"=>7);
    asort($myArray);
    $myArrayKeys = array_keys($myArray);
    
    $newArray = array();
    while (!empty($myArray)) {
        $newArray[array_shift($myArrayKeys)] = array_shift($myArray);
        if (!empty($myArray))
            $newArray[array_pop($myArrayKeys)] = array_pop($myArray);
    }
    var_dump($newArray);
    

    or, if you want largest first:

    $myArray = array("A"=>10, "B"=>2, "C"=>5, "D"=>1, "E"=>30, "F"=>1, "G"=>7);
    asort($myArray);
    $myArrayKeys = array_keys($myArray);
    
    $newArray = array();
    while (!empty($myArray)) {
        $newArray[array_pop($myArrayKeys)] = array_pop($myArray);
        if (!empty($myArray))
            $newArray[array_shift($myArrayKeys)] = array_shift($myArray);
    }
    var_dump($newArray);