2014-05-19 12 views
5

Tôi có thể sắp xếp mảng đa chiều nhưng không giữ liên kết chỉ mục bằng số.array_multisort với duy trì liên kết chỉ số bằng số

Làm cách nào để giữ liên kết chỉ mục bằng số?

Mã sản phẩm:

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

) 

MONG MUỐN 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 
     ) 

) 
+0

@Naruto Các sự trùng lặp có thể được sử dụng 'usort 'nhưng tôi đang sử dụng' array_multisort' – itsazzad

+3

Tạo chức năng người dùng của riêng bạn thay vào đó, điều này sẽ giải quyết vấn đề của bạn và đặt câu hỏi giống nhau. – vogomatix

+0

@vogomatix Vui lòng kiểm tra câu hỏi chỉnh sửa. Câu hỏi cũ đã làm cho nó trùng lặp. Bây giờ nó không nên trùng lặp. – itsazzad

Trả lời

0

Để sử dụng đầu ra mong muốn của bạn mã này:

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

Hoặc bạn có thể chỉ cần đăng mã ở đây. – deceze

+0

giải thích chi tiết về cách tôi có thể đăng mã của mình tại đây –

+0

Tại sao tôi phải có khi có phần trợ giúp cho nó? 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); 

hoặc sử dụng 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; 

    } 
); 

nhưng hiệu suất uasort là tồi tệ hơn đáng kể so với array_multisort

Các vấn đề liên quan