问题
I can sort a multidimensional array but without keeping the numerical index association.
How can I keep the numerical index association?
CODE:
$waiters[76] = array('weight' => 67, 'specialties' => 1);
$waiters[14] = array('weight' => 41, 'specialties' => 2);
$waiters[58] = array('weight' => 85, 'specialties' => 3);
$waiters[89] = array('weight' => 98, 'specialties' => 4);
$waiters[68] = array('weight' => 86, 'specialties' => 5);
$waiters[31] = array('weight' => 13, 'specialties' => 6);
print_r($waiters);
// Obtain a list of waiters
foreach ($waiters as $id => $waiter) {
$weight[$id] = $waiter['weight'];
$specialties[$id] = $waiter['specialties'];
}
// Sort the data with weight descending, specialties ascending
// Add $data as the last parameter, to sort by the common key
array_multisort(
$weight, SORT_DESC, SORT_NUMERIC,
$specialties, SORT_ASC, SORT_NUMERIC,
$waiters
);
print_r($waiters);
OUTPUT:
Array
(
[0] => Array
(
[weight] => 98
[specialties] => 4
)
[1] => Array
(
[weight] => 86
[specialties] => 5
)
[2] => Array
(
[weight] => 85
[specialties] => 3
)
[3] => Array
(
[weight] => 67
[specialties] => 1
)
[4] => Array
(
[weight] => 41
[specialties] => 2
)
[5] => Array
(
[weight] => 13
[specialties] => 6
)
)
DESIRED OUTPUT:
Array
(
[89] => Array
(
[weight] => 98
[specialties] => 4
)
[68] => Array
(
[weight] => 86
[specialties] => 5
)
[58] => Array
(
[weight] => 85
[specialties] => 3
)
[76] => Array
(
[weight] => 67
[specialties] => 1
)
[14] => Array
(
[weight] => 41
[specialties] => 2
)
[31] => Array
(
[weight] => 13
[specialties] => 6
)
)
回答1:
$keys = array_keys($waiters);
array_multisort(
$weight, SORT_DESC, SORT_NUMERIC,
$specialties, SORT_ASC, SORT_NUMERIC,
$waiters, $keys
);
$waiters = array_combine($keys, $waiters);
or use uasort
uasort(
$data,
function ($some_data, $another_data) {
$result = 0;
if ($some_data['weight'] > $another_data['weight']) {
$result = -1;
} elseif ($some_data['weight'] < $another_data['weight']) {
$result = 1;
} elseif ($some_data['specialties'] > $another_data['specialties']) {
$result = 2;
} elseif ($some_data['specialties'] < $another_data['specialties']) {
$result = -2;
}
return $result;
}
);
but the uasort performance is significantly worse than array_multisort
回答2:
For Your Desired output use this code:
<?php
$waiters[76] = array('weight' => 67, 'specialties' => 1);
$waiters[14] = array('weight' => 41, 'specialties' => 2);
$waiters[58] = array('weight' => 85, 'specialties' => 3);
$waiters[89] = array('weight' => 98, 'specialties' => 4);
$waiters[68] = array('weight' => 86, 'specialties' => 5);
$waiters[31] = array('weight' => 13, 'specialties' => 6);
//ksort($waiters);
//$waiters = array_reverse($waiters, true);
print_r($waiters);
// Obtain a list of waiters
foreach($waiters as $id=>$w){
$w[$id] = $w['weight'];
}
foreach ($waiters as $ii => $va) {
$sorter[$ii] = $va['weight'];
}
natcasesort($sorter);
foreach ($sorter as $ii => $va) {
$ret[$ii] = $waiters[$ii];
}
echo "<pre>";
$ret = array_reverse($ret, true);
print_r($ret);
?>
来源:https://stackoverflow.com/questions/23740747/array-multisort-with-maintaining-numeric-index-association