2011-10-20 21 views
5

Có thể sắp xếp mảng đa chiều theo nhiều cột bằng cách sử dụng sắp xếp tự nhiên trong PHP không? Đây là một ví dụ. Giả sử tôi có một mảng 2D của dữ liệu, ví dụ,array_multisort với kiểu tự nhiên

$array[1]['Name'] = 'John'; 
$array[1]['Age'] = '20'; 
$array[1]['Code'] = 'ABC 12'; 

$array[2]['Name'] = 'John'; 
$array[2]['Age'] = '21'; 
$array[2]['Code'] = 'ABC 1'; 

$array[3]['Name'] = 'Mary'; 
$array[3]['Age'] = '20'; 
$array[3]['Code'] = 'ABC 10'; 

Tôi muốn sắp xếp mảng này theo tên (ASC), sau đó theo độ tuổi (DESC), và theo mã (ASC), tất cả sẽ được sắp xếp một cách tự nhiên. Về cơ bản sẽ là array_multisort với sắp xếp tự nhiên.

Tôi đã tìm thấy nhiều giải pháp về chủ đề này trên web. Thật không may, họ chỉ hỗ trợ sắp xếp theo một cột, không phải nhiều cột.

Trả lời

6

Tôi nghĩ rằng bạn phải thực hiện một chức năng so sánh tùy chỉnh cho hành vi này:

function myCmp($a, $b) { 
$nameCmp = strnatcasecmp($a['Name'], $b['Name']); 
$ageCmp = strnatcasecmp($a['Age'], $b['Age']); 
$codeCmp = strnatcasecmp($a['Code'], $b['Code']); 

if ($nameCmp != 0) // Names are not equal 
    return($nameCmp); 

// Names are equal, let's compare age 

if ($ageCmp != 0) // Age is not equal 
    return($ageCmp * -1); // Invert it since you want DESC 

// Ages are equal, we don't need to compare code, just return the comparison result 
    return($codeCmp); 
} 

Sau đó, bạn có thể gọi usort($array, 'myCmp'); và sẽ nhận được phân loại mong muốn

+0

Cảm ơn bạn !!!!!!!!! –

+0

Tuyệt vời! cảm tạ – TeChn4K

0

Mã này sẽ làm các trick:

// Your original data stored in $array 
$array[1]['Name'] = 'John'; 
$array[1]['Age'] = '20'; 
$array[1]['Code'] = 'ABC 12'; 

$array[2]['Name'] = 'John'; 
$array[2]['Age'] = '21'; 
$array[2]['Code'] = 'ABC 1'; 

$array[3]['Name'] = 'Mary'; 
$array[3]['Age'] = '20'; 
$array[3]['Code'] = 'ABC 10'; 

// Since array_multisort() needs arrays of columns we need to 
// transform it and preserve he keys 
foreach ($array as $key => $row) { 
    $names[$key] = $row['Name']; 
    $ages[$key] = $row['Age']; 
    $codes[$key] = $row['Code']; 
} 

// Sort it according to your criterias 
array_multisort($names, SORT_ASC, $ages, SORT_DESC, $codes, SORT_ASC, $array); 

// $array now contains your sorted array. 

Liên kết đến codepad: http://codepad.org/tr83Wt5J

+0

Cảm ơn, nhưng điều này sẽ chỉ thực hiện sắp xếp thông thường, không phải là sắp xếp tự nhiên. –

+0

Ồ, ngớ ngẩn tôi. Bỏ lỡ phần tự nhiên mặc dù bạn đã nhắc đến nó nhiều lần. Giải pháp Klaustopher hoạt động như một sự quyến rũ trong trường hợp đó :) – Marcus

1

Nếu bạn đang sử dụng PHP 5.4 hoặc mới hơn, bạn có thể sử dụng array_multisort với cờ SORT_NATURAL.

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