Reputation: 534
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
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
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