2013-06-24 24 views
6

Tôi đã chuỗi kí tự sau như sau:PHP Chuỗi Có Integer

1BG200,1M400,1BA1000 

Và tôi muốn để so sánh chuỗi trên vào quyết định thứ tự ...

Code:

$sql = "SELECT * FROM collected WHERE c_no BETWEEN '".$from."' AND '".$to."' ORDER BY c_no Desc"; 

Đầu ra:

1M400 
1BG200 
1BA1000 

Nó nên là 1000 lớn hơn, sau đó 400, 200 .. Làm thế nào tôi có thể so sánh chúng? Tôi tin rằng nó không đúng để so sánh chuỗi có chứa số nguyên! Và tôi không thể tìm ra giải pháp đúng cho vấn đề của mình?

Một số người đã đề xuất sử dụng preg_match hoặc substr .. Nhưng bạn có thể thấy có các ký tự đơn và đôi (M và BG).

Xin lỗi, tôi không quen với PHP .. Vui lòng trợ giúp!

+0

Vì vậy, phần phụ thuộc chỉ dành cho các thuật toán sắp xếp là kết thúc trình tự chữ số? – Daniel

+0

@ Daniel Vâng tôi muốn so sánh chuỗi đầy đủ, nhưng có vẻ như nó không hoạt động với tôi. Vì vậy, yea, tôi muốn bỏ qua các chữ cái và sắp xếp thứ tự chữ số. – Alihamra

Trả lời

3

Bạn có thể sử dụng một loại tùy chỉnh, chỉ nhìn vào phần số

function cmp($a, $b) 
{ 
    $numa = intval(preg_replace('/[0-9]*[A-Z]+/', '', $a)); 
    $numb = intval(preg_replace('/[0-9]*[A-Z]+/', '', $b)); 
    if($a == $b) return 0; 
    return ($a < $b) ? -1 : 1; 
} 

//Now get the list and sort 
usort($list, "cmp"); 
+2

Ngoài ra, nếu bạn muốn chữ số hàng đầu là một phần của thuật toán sắp xếp, bạn cũng sẽ trao đổi mẫu cho '"/[^ 0-9]/"' sẽ căn cứ sắp xếp trên tất cả các chữ số. – Daniel

2

Bạn có thể sử dụng preg_replace('/[0-9][A-Z]+/', '', $var) để xóa số đầu tiên và sau đó một chữ cái sau, sau đó sử dụng php usort.

1

Bạn có thể thêm chức năng tùy chỉnh vào MySQL của mình. Tìm thấy một trong đó trông giống như nó có thể loại bỏ tất cả các ký tự không có chữ số MySQL strip non-numeric characters to compare.

Tôi rất khuyên bạn nên thực hiện việc này để đưa mọi thứ trở lại php và sắp xếp nếu bạn quyết định sử dụng giới hạn/bù đắp do kết quả lớn được trả lại. Nếu không, bạn sẽ phải kéo tất cả mọi thứ trở lại PHP sau đó ghép một mảng tại điểm mà tôi cảm thấy nó sẽ là một sử dụng tài nguyên không hiệu quả. Ngoài ra, bạn có thể thêm cột sắp xếp vào bảng nếu đó là một tùy chọn khả thi, để cho phép bạn sử dụng tốt hơn các chỉ mục trong MySQL, tùy thuộc vào bộ hồ sơ của bạn có thể là sự khác biệt hiệu suất rất lớn.

+0

+1 cho cột sắp xếp –

0

trong tiền lương chung là tốn kém. Để đạt được một số từ mô hình trao tôi sẽ làm một cái gì đó như thế này:

digitstri='1M400'; // just an example 
number=intval(is_number(digitstri{2})?substr(digitstri,2):substr(digitstri,3)) 

Tôi nghĩ, sắp xếp từ đó là rõ ràng ...