2010-01-17 78 views
10

Tôi muốn sắp xếp các giá trị của một mảng theo thứ tự bảng chữ cái trong PHP. Nếu tất cả các giá trị bắt đầu với cùng một ký tự thì chúng phải được sắp xếp bằng ký tự thứ hai và vân vân. Bỏ qua trường hợp nhạy cảm.PHP: Cách sắp xếp giá trị của một mảng theo thứ tự bảng chữ cái?

Ví dụ:

before: 
values[0] = "programming"; 
values[1] = "Stackoverflow"; 
values[2] = "question"; 
values[3] = "answers"; 
values[4] = "AA Systems"; 

after: 
values[0] = "AA Systems"; 
values[1] = "answers"; 
values[2] = "programming"; 
values[3] = "question"; 
values[4] = "Stackoverflow"; 

Tôi đã tìm thấy một số thuật toán nhưng tôi muốn có một cách đó là nhanh chóng và với số lượng nhỏ các báo cáo. Bỏ qua trường hợp nhạy cảm là đặc biệt đối với tôi. Cảm ơn.

Trả lời

5

dụ của bạn làm cho hai giả định:

  1. đó bạn chỉ được giao dịch với đơn giản mảng, 1 chiều.

  2. Sau khi sắp xếp theo thứ tự bảng chữ cái, chỉ mục của bạn sẽ cập nhật sao cho thành phần đầu tiên theo thứ tự bảng chữ cái sẽ được gán khóa 0 và cứ thế.

Với những thông số này, giải pháp đơn giản nhất của bạn là sử dụng phương pháp mảng sort(). Với ví dụ của bạn:

$values[0] = "programming"; 
$values[1] = "Stackoverflow"; 
$values[2] = "question"; 
$values[3] = "answers"; 
$values[4] = "AA Systems"; 

sort($values); 

nào sẽ cho kết quả như sau:

Array { 
    [0] => AA Systems 
    [1] => Stackoverflow 
    [2] => answers 
    [3] => programming 
    [4] => question 
} 

other array sorting functions đó có thể là một sự phù hợp tốt hơn. Ví dụ, cái đơn giản tôi sử dụng ở trên đặt chữ hoa ở phía trước chữ thường, vì vậy nếu bạn có "bảo mật" dưới dạng mục (tất cả chữ thường) nó sẽ theo sau "Stackoverflow" vì chữ hoa trên s sẽ được ưu tiên hơn se so với st. Để sắp xếp mà không trường hợp nhạy cảm, bạn có thể sử dụng natcasesort(), mà sẽ tạo ra những điều sau đây với mảng:

Array { 
    [0] => AA Systems 
    [1] => answers 
    [2] => programming 
    [3] => question 
    [4] => Stackoverflow 
} 
+0

Sắp xếp phân biệt chữ hoa chữ thường. Stackoverflow sẽ được đặt * trước * câu trả lời. – Tyzoid

4

Tính đến phiên bản 5.4.0, bạn chỉ có thể sử dụng bất kỳ sort, asort, ksort, vv và vượt qua cờ SORT_FLAG_CASE.

sort($array, SORT_FLAG_CASE); // Non-associative array 
asort($array, SORT_FLAG_CASE); // Associative array 
ksort($array, SORT_FLAG_CASE); // Associative array, sort by indices 

Nếu bạn đã có một phiên bản cũ và chưa sẵn sàng để cập nhật (hoặc không thể), bạn có thể sử dụng natcasesort như những người khác đã đề cập, mà còn các biến thể uasortksort với strcasecmp như tùy chỉnh chức năng:

natcasesort($array);   // Non-associative array 
uasort($array, 'strcasecmp'); // Associative array 
uksort($array, 'strcasecmp'); // Associative array, sort by indices 

Bạn có thể áp dụng cùng một khái niệm cho bất kỳ sorting functions nào khác.

+0

Câu trả lời đúng cho câu hỏi này là '' 'ksort ($ data, SORT_FLAG_CASE | SORT_NATURAL);' '' –

0

Bạn có thể sử dụng uasort(): http://php.net/manual/en/function.uasort.php

uasort($arr, 'strcasecmp'); 

Đối số thứ hai là một chức năng, trong đó so sánh giá trị. Hàm này phải trả về -1, 0 hoặc 1. Đây là một mẫu mà bạn có thể sử dụng cho các hàm tùy chỉnh của mình.

function cmp($a, $b) { 
    if ($a == $b) return 0; 
    elseif ($a > $b) return 1; 
    elseif ($a < $b) return -1; 
} 

uasort($arr, 'cmp'); 

Sau khi sắp xếp, bạn có thể muốn đặt lại chỉ mục mảng.

$arr = array_values($arr); 
Các vấn đề liên quan