ojsglobal
ojsglobal

Reputation: 534

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)

Upvotes: -1

Views: 406

Answers (2)

mickmackusa
mickmackusa

Reputation: 47894

Simply sort the input array in a descending direction (preserving keys), then at every second element, move all remaining elements except for the last element to the end of the array.

Code: (Demo)

$array = ["A" => 10, "B" => 2, "C" => 5, "D" => 1, "E" => 30, "F" => 1, "G" => 7];
arsort($array);
for ($i = 1, $count = count($array); $i < $count; $i += 2) {
    $array += array_splice($array, $i, -1);
}
var_export($array);

Output:

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

Upvotes: 0

Mark Baker
Mark Baker

Reputation: 212412

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);

Upvotes: 2

Related Questions