2015-07-02 14 views
7

Nếu có một uasort chức năng khá cơ bản trong PHP trông như thế này:Tiếp cận chủ chốt mảng sử dụng uasort trong PHP

uasort($arr, function($a, $b) { 
       if ($a > $b) 
        return -1; 
       if ($a < $b) 
        return 1; 
... 
} 

Mảng Tôi đang cố gắng để sắp xếp trông giống như sau:

{[1642] => 1, [9314] => 4, [1634] => 3 ...} 

Nó chứa số nguyên là tiêu chí so sánh chính của tôi. Tuy nhiên, nếu các số nguyên bằng nhau, thì tôi muốn truy cập các giá trị khóa của chúng, bên trong hàm uasort và thực hiện một số phép thuật với nó để tìm ra phân loại từ đó.

Tôi không biết cách làm như thế có vẻ như các biến số $a$b được chuyển vào hàm chỉ là số nguyên không có các khóa tương ứng nhưng cũng phải có cách để truy cập khóa từ I ' m bằng cách sử dụng một chức năng để thực sự bảo vệ các phím. Bất kỳ ý tưởng?

+0

kỳ diệu gì chúng ta đang nói về việc ở đây? Có thể có những cách khác để làm điều này. – Andrew

+0

'Ma thuật' hoặc logic của ứng dụng khá lộn xộn vì nó liên quan đến các truy vấn DB đặc biệt nếu các số nguyên bằng nhau. May mắn thay, hầu hết thời gian họ không và tôi có thể nghĩ về một workaround, ví dụ, bằng cách tạo ra một mảng 2D mà giữ các số nguyên như một giá trị và chìa khóa như là khác sau đó nguồn cấp dữ liệu cho uasort. Tuy nhiên, tôi hy vọng rằng có một cách tốt hơn và dễ dàng hơn để làm điều đó. – mmvsbg

Trả lời

10
uksort($arr, function ($a, $b) use ($arr) { 
    return $arr[$a] - $arr[$b] ?: $a - $b; 
}); 

Bạn có thể nhận các giá trị của các phím, vì vậy sử dụng uksort mang đến cho bạn các phím. Thay thế $a - $b bằng ma thuật phù hợp của bạn, tại đây nó chỉ phân loại theo giá trị của khóa.

+0

Chỉ cần quan tâm: Có phải chỉ là môi trường 5.3.1 PHP của tôi, hoặc những người dùng khác có quan sát vấn đề với mệnh đề 'use()' không? – cars10m

+1

Nó cũng hoạt động trong môi trường của tôi, nếu bạn sử dụng 'use (& $ arr)' thay vì chỉ 'use ($ arr)'. Các nội dung (tức là thứ tự) của '$ arr' thay đổi theo thời gian và' sử dụng ($ arr) 'sẽ chỉ làm việc với một bản sao ** tĩnh **, xem tại đây: http: //php.net/manual/de /functions.anonymous.php – cars10m

+0

Cảm ơn bạn, chính xác những gì tôi cần. Tôi khách 'uasort' chỉ là sai chức năng để sử dụng trong trường hợp này. Tôi đang chạy trên PHP 5.4 và 5.5 nên không có vấn đề với 'sử dụng', hoạt động ra khỏi hộp. – mmvsbg

0

Các use chỉ thị (trong dung dịch deceze của) không hoạt động trong tuổi cài đặt PHP 5.3.1 của tôi, trong khi điều này sẽ mang lại kết quả:

$arr=array('1642'=>1,'9314'=>2,'1634'=>1,'1633'=>5,'1636'=>7,'1610'=>1); 
print_r($arr); 

function mycmp($a, $b) { 
if ($a > $b) return -1; 
if ($a < $b) return 1; 
else return 0; 
} 
function mysrt($arr){ 
foreach ($arr as $k => $v) $new[$k]="$v $k"; 
uasort($new, 'mycmp'); $ret=array(); 
foreach ($new as $k => $v) $ret[$k]=$arr[$k]; 
return $ret; 
} 
print_r(mysrt($arr)); 

mysrt() không loại 'tại chỗ' nhưng sẽ trở lại mảng được sắp xếp. Và tất nhiên: "ma thuật" của tôi trên phân loại chính là khá cơ bản. Các phím sẽ được sắp xếp theo cùng cách với các giá trị. Bằng cách sửa đổi tuyên bố $new[$k]="$v $k";, bạn có thể thay đổi hành vi cho phù hợp với nhu cầu của mình.

như một mặt lưu ý ...

deceze của giải pháp sẽ làm việc trên máy chủ của tôi chỉ khi tôi sử dụng use(&$arr) thay vì use($arr):

uksort($arr, function ($a, $b) use(&$arr) { 
    return $arr[$a] - $arr[$b] ? $arr[$a] - $arr[$b] : $a - $b; 
}); 
Các vấn đề liên quan