2010-03-19 37 views
80

tôi đã có structue sau của mảng:PHP Sắp xếp mảng By subarray Value

Array 
     (
      [0] => Array 
       (
        [configuration_id] => 10 
        [id] => 1 
        [optionNumber] => 3 
        [optionActive] => 1 
        [lastUpdated] => 2010-03-17 15:44:12 
       ) 

      [1] => Array 
       (
        [configuration_id] => 9 
        [id] => 1 
        [optionNumber] => 2 
        [optionActive] => 1 
        [lastUpdated] => 2010-03-17 15:44:12 
       ) 

      [2] => Array 
       (
        [configuration_id] => 8 
        [id] => 1 
        [optionNumber] => 1 
        [optionActive] => 1 
        [lastUpdated] => 2010-03-17 15:44:12 
       ) 
    ) 

cách tốt nhất cho đơn đặt hàng mảng là gì, một cách gia tăng dựa trên optionNumber?

Vì vậy, các kết quả như sau:

Array 
     (
      [0] => Array 
       (
        [configuration_id] => 8 
        [id] => 1 
        [optionNumber] => 1 
        [optionActive] => 1 
        [lastUpdated] => 2010-03-17 15:44:12 
       ) 

      [1] => Array 
       (
        [configuration_id] => 9 
        [id] => 1 
        [optionNumber] => 2 
        [optionActive] => 1 
        [lastUpdated] => 2010-03-17 15:44:12 
       ) 

      [2] => Array 
       (
        [configuration_id] => 10 
        [id] => 1 
        [optionNumber] => 3 
        [optionActive] => 1 
        [lastUpdated] => 2010-03-17 15:44:12 
       ) 
    ) 

Trả lời

152

Sử dụng usort.

function cmp_by_optionNumber($a, $b) { 
    return $a["optionNumber"] - $b["optionNumber"]; 
} 

... 

usort($array, "cmp_by_optionNumber"); 

Trong PHP ≥5.3, bạn nên sử dụng một anonymous function thay vì:

usort($array, function ($a, $b) { 
    return $a['optionNumber'] - $b['optionNumber']; 
}); 

Lưu ý rằng cả hai mã trên giả định $a['optionNumber'] là một số nguyên. Sử dụng @St. John Johnson's solution nếu chúng là chuỗi.


Trong PHP ≥7.0, sử dụng spaceship operator <=> thay vì trừ để ngăn chặn sự cố tràn/cắt.

usort($array, function ($a, $b) { 
    return $a['optionNumber'] <=> $b['optionNumber']; 
}); 
+1

Điều đó không thực sự giúp tôi sử dụng chức năng - đó là điều khó khăn mà tôi không thể làm nổi bật đầu của mình – Sjwdavies

+11

Vâng, anh ấy đã cho bạn chức năng để sử dụng. Và bạn sẽ phải chấp nhận rằng không phải lúc nào cũng có chức năng tích hợp để làm những gì bạn muốn, bạn phải tự viết nó. Hàm so sánh chỉ yêu cầu trả về 1, 0 hoặc -1 cho biết thứ tự sắp xếp cho hai phần tử. – Tesserex

+1

Tôi nhìn xa hơn vào usort và nó thực sự là khá mát mẻ. Tôi đã viết một hàm so sánh đơn giản với chức năng ở trên, tuy nhiên đã bỏ lỡ '=='. Cảm ơn các bạn đã giúp đỡ – Sjwdavies

48

Sử dụng usort

usort($array, 'sortByOption'); 
function sortByOption($a, $b) { 
    return strcmp($a['optionNumber'], $b['optionNumber']); 
} 
+0

Điều này làm việc cho tôi. @ KennyTM's dường như không hoạt động –

+7

@BenSinclair, đó là vì giải pháp của Kenny dành cho các con số, giải pháp này là dành cho các chuỗi. Cả hai đều chính xác :-) +1 cho giải pháp thay thế này. – kubilay

+0

Làm việc cho tôi, bởi vì tôi đang phân loại dây ... – Andy

4

Các phím được loại bỏ khi sử dụng một chức năng tương tự như trên. Nếu các phím là quan trọng, các chức năng sau đây sẽ duy trì nó ... nhưng vòng foreach là khá kém hiệu quả.

function subval_sort($a,$subkey) { 
    foreach($a as $k=>$v) { 
     $b[$k] = strtolower($v[$subkey]); 
    } 
    asort($b); 
    foreach($b as $key=>$val) { 
     $c[$key] = $a[$key]; 
    } 
    return $c; 
} 
$array = subval_sort($array,'optionNumber'); 

Sử dụng arsort thay vì asort nếu bạn muốn từ cao đến thấp.

tín dụng

Code: http://www.firsttube.com/read/sorting-a-multi-dimensional-array-with-php/

3

PHP 5.3+

usort($array, function($a,$b){ return $a['optionNumber']-$b['optionNumber'];}); 
11

tôi đã sử dụng cả hai giải pháp bởi KennyTMAJ Quick và đã đưa ra một chức năng mà có thể giúp đỡ trong vấn đề này trong nhiều trường hợp như thế sử dụng ASC hoặc DESC phân loại hoặc phím bảo quản hoặc nếu bạn có đối tượng là trẻ em thuộc mảng.

Đây là chức năng này:

/** 
* @param array $array 
* @param string $value 
* @param bool $asc - ASC (true) or DESC (false) sorting 
* @param bool $preserveKeys 
* @return array 
* */ 
function sortBySubValue($array, $value, $asc = true, $preserveKeys = false) 
{ 
    if ($preserveKeys) { 
     $c = array(); 
     if (is_object(reset($array))) { 
      foreach ($array as $k => $v) { 
       $b[$k] = strtolower($v->$value); 
      } 
     } else { 
      foreach ($array as $k => $v) { 
       $b[$k] = strtolower($v[$value]); 
      } 
     } 
     $asc ? asort($b) : arsort($b); 
     foreach ($b as $k => $v) { 
      $c[$k] = $array[$k]; 
     } 
     $array = $c; 
    } else { 
     if (is_object(reset($array))) { 
      usort($array, function ($a, $b) use ($value, $asc) { 
       return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} - $b->{$value}) * ($asc ? 1 : -1); 
      }); 
     } else { 
      usort($array, function ($a, $b) use ($value, $asc) { 
       return $a[$value] == $b[$value] ? 0 : ($a[$value] - $b[$value]) * ($asc ? 1 : -1); 
      }); 
     } 
    } 

    return $array; 
} 

Cách sử dụng:

sortBySubValue($array, 'optionNumber', true, false); 

Sửa

Phần đầu tiên có thể được viết lại bằng uasort() và functi trên sẽ ngắn hơn:

/** 
* @param array $array 
* @param string $value 
* @param bool $asc - ASC (true) or DESC (false) sorting 
* @param bool $preserveKeys 
* @return array 
* */ 
function sortBySubValue($array, $value, $asc = true, $preserveKeys = false) 
{ 
    if (is_object(reset($array))) { 
     $preserveKeys ? uasort($array, function ($a, $b) use ($value, $asc) { 
      return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} - $b->{$value}) * ($asc ? 1 : -1); 
     }) : usort($array, function ($a, $b) use ($value, $asc) { 
      return $a->{$value} == $b->{$value} ? 0 : ($a->{$value} - $b->{$value}) * ($asc ? 1 : -1); 
     }); 
    } else { 
     $preserveKeys ? uasort($array, function ($a, $b) use ($value, $asc) { 
      return $a[$value] == $b[$value] ? 0 : ($a[$value] - $b[$value]) * ($asc ? 1 : -1); 
     }) : usort($array, function ($a, $b) use ($value, $asc) { 
      return $a[$value] == $b[$value] ? 0 : ($a[$value] - $b[$value]) * ($asc ? 1 : -1); 
     }); 
    } 
    return $array; 
} 
+0

Đây là câu trả lời hữu ích nhất ở đây, nên ở trên cùng;) –

+0

@EdiBudimilic cảm ơn bạn, tôi đánh giá cao nó! Bằng cách này tôi đã cập nhật câu trả lời của tôi và thêm một phiên bản ngắn hơn của chức năng này :) –

+1

Để thực hiện công việc này cho tôi, tôi đã phải sử dụng '>' (lớn hơn) thay vì '-' (trừ) khi so sánh' $ a' và '$ b' giá trị kể từ khi tôi so sánh chuỗi. Vẫn hoạt động. – James