2012-07-29 22 views
5

tôi có các mảng sau:Nhiều loại trong một mảng

Array 
(
[0] => Array 
    (
     [note] => test 
     [year] => 2011 
     [type] => football 
    ) 

[1] => Array 
    (
     [note] => test1 
     [year] => 2010 
     [type] => basket 
    ) 

[2] => Array 
    (
     [note] => test2 
     [year] => 2012 
     [type] => football 
    ) 

[3] => Array 
    (
     [note] => test3 
     [year] => 2009 
     [type] => basket 
    ) 

[4] => Array 
    (
     [note] => test4 
     [year] => 2010 
     [type] => football 
    ) 

) 

Và tôi muốn đầu tiên sắp xếp nó theo một mảng theo loại:

Ví dụ: $sort = array('football','basket');

Và sau đó bởi năm.

Tôi có thể làm như thế nào?

Cảm ơn.

đầu ra mong muốn nên là:

Array 
(
[2] => Array 
    (
     [note] => test2 
     [year] => 2012 
     [type] => football 
    ) 
[0] => Array 
    (
     [note] => test 
     [year] => 2011 
     [type] => football 
    ) 
[4] => Array 
    (
     [note] => test4 
     [year] => 2010 
     [type] => football 
    ) 

[1] => Array 
    (
     [note] => test1 
     [year] => 2010 
     [type] => basket 
    ) 

[3] => Array 
    (
     [note] => test3 
     [year] => 2009 
     [type] => basket 
    ) 

) 

Tôi không quan tâm nếu chúng ta thiết lập lại các giá trị chỉ mục.

Cảm ơn.

Trả lời

2

Sử dụng array_multisort. Giả sử mảng của bạn là $arr:

foreach($arr as $key=>$row) { 
    $type[$key] = $row['type']; 
    $year[$key] = $row['year']; 
} 
array_multisort($type, SORT_ASC, $year, SORT_ASC, $arr); 

Để sử dụng một mảng addictional quy định cụ thể nhằm loại, bạn có thể làm: liên kết

$sortBy = array('football','basket'); 
foreach($arr as $key=>$row) { 
    $type[$key] = array_search($row['type'],$sortBy); 
    $year[$key] = $row['year']; 
} 
array_multisort($type, SORT_ASC, $year, SORT_ASC, $arr); 

Ví dụ:

http://codepad.org/qhZCpbZE

+0

Cảm ơn bạn đời, có vẻ như nó hoạt động. Nhưng làm thế nào tôi có thể bao gồm mảng $ sortBy? – glarkou

+0

@salamis Tôi cũng đã chỉnh sửa câu trả lời của mình. – lafor

+0

Cảm ơn bạn đời có vẻ như nó hoạt động như mong đợi. Một câu hỏi nhanh. Tại sao chúng ta vẫn sử dụng '$ type, SORT_ASC' nếu chúng ta sắp xếp theo mảng khác? – glarkou

1

Sử dụng

function byType($a, $b) 
{ 
    if ($a['type'] == $b['type']) { 
     return 0; 
    } 

    foreach(array('football','basket') as $type) { 
     if ($a['type']=$type) return -1; 
     if ($b['type']=$type) return 1; 
    } 

    return 0; 
} 


function byYear($a, $b) 
{ 
    if ($a['year'] == $b['year']) { 
     return 0; 
    } 
    return ($a['year'] < $b['year']) ? -1 : 1; 
} 

usort($array,"byType"); 
usort($array,"byYear"); 
+0

Nó không phải là người bạn đời làm việc. Trước hết, vì tôi không thể sử dụng mảng khác để sắp xếp theo loại. Và thứ hai khi usort thứ hai được thực hiện tất cả mọi thứ có được trộn lẫn một lần nữa. Vui lòng kiểm tra: http://codepad.org/PO3CvGsu và kết quả mong muốn. Tôi muốn sắp xếp theo năm chỉ xảy ra nếu loại này giống nhau. – glarkou

+0

Nó đang hoạt động. http://codepad.org/PwYKyyMS – Adi

+0

@Adnan Nó không hoạt động, thay đổi mảng, nó hiện đang hoạt động bằng "may mắn" – Leigh

4

Yêu cầu một phiên bản của PHP hỗ trợ đóng cửa khi chạy dưới dạng

Mảng phụ của bạn có thể được xác định bên ngoài chính sắp xếp. Nếu bạn không thể hỗ trợ đóng cửa, thì điều này có thể được đặt trực tiếp vào thường trình sắp xếp.

$sortBy = array('football', 'basket'); 

Sắp xếp thường trình.

Sắp xếp theo năm nếu các loại giống nhau và sắp xếp theo loại trong ví dụ $sortBy của bạn.

usort($a, function($a, $b) use ($sortBy) { 
    if ($a['type'] == $b['type']) { 
     return ($b['year'] - $a['year']); 
    } 
    $typeOrder = array_flip($sortBy); 
    return $typeOrder[$a['type']] - $typeOrder[$b['type']]; 
}); 
+0

Tôi làm cách nào để sử dụng? Tôi đã thử http://codepad.org/HCodcfgl nhưng nó dường như không hợp tác với bạn. Cảm ơn bạn đã giúp đỡ. – glarkou

+0

@salamis Codepad là PHP 5.2, 6 tuổi và không hỗ trợ đóng. Phiên bản PHP nào ** bạn ** sử dụng? (Bạn cũng có thể sử dụng [codepad của Viper 7] (http://codepad.viper-7.com/MpTYaB)) – Leigh

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