2014-05-19 62 views
5

我可以排序多維數組,但不保留數字索引關聯。array_multisort與維護數字索引關聯

如何保持數字指數關聯?

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 
     ) 

) 

期望的輸出:

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 
     ) 

) 
+0

@Naruto可能出現重複使用'usort使用'但我正在使用'array_multisort' – itsazzad

+3

改爲創建自己的用戶函數,這將解決您的問題並使問題相同。 – vogomatix

+0

@vogomatix請檢查問題編輯。舊的問題是重複。現在它不應該重複。 – itsazzad

回答

0

對於所需輸出使用此代碼:

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

?> 
+1

或者你可以簡單地在這裏發佈代碼。 – deceze

+0

詳細解釋我如何在此處發佈我的代碼 –

+0

爲什麼我需要在何時有幫助部分? http://stackoverflow.com/editing-help#code – deceze

8
$keys = array_keys($waiters); 
array_multisort(
    $weight, SORT_DESC, SORT_NUMERIC, 
    $specialties, SORT_ASC, SORT_NUMERIC, 
    $waiters, $keys 
); 
$waiters = array_combine($keys, $waiters); 

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

    } 
); 

但uasort性能顯著不如在array_multisort