2010-04-23 74 views
6

tôi đã viết một tập lệnh để tạo một mảng dữ liệu nhưng bây giờ muốn hiển thị theo thứ tự điểm số. Các mảng kết quả đầu ra như sau;Cách sắp xếp nhiều mảng trong PHP

[display_name] => Array 
    (
     [0] => ACT_Web_Designs 
     [1] => user1_design 
     [2] => user2_design 
    ) 

[proffesion] => Array 
    (
     [0] => Web Developer 
     [1] => web developer 
     [2] => Web Developer 
    ) 

[score] => Array 
    (
     [0] => 15 
     [1] => 6 
     [2] => 15 
    ) 

[img] => Array 
    (
     [0] => ./?0000=gif&0001=3fadb8c362ff39f3322909899ff14760&0002=prof_pic 
     [1] => 
     [2] => 
    ) 

Tóm lại, tôi muốn nó được chuyển đổi như sau;

[display_name] => Array 
    (
     [0] => ACT_Web_Designs 
     [1] => user2_design 
     [2] => user1_design 
    ) 

[proffesion] => Array 
    (
     [0] => Web Developer 
     [1] => web developer 
     [2] => Web Developer 
    ) 

[score] => Array 
    (
     [0] => 15 
     [1] => 15 
     [2] => 6 
    ) 

[img] => Array 
    (
     [0] => ./?0000=gif&0001=3fadb8c362ff39f3322909899ff14760&0002=prof_pic 
     [1] => 
     [2] => 
    ) 

Tôi đã xem xét asort() nhưng không thể nhận được bất cứ điều gì để làm việc. bất kì sự trợ giúp nào đều được đánh giá cao.

+1

là dữ liệu từ cơ sở dữ liệu? Có thể bạn sắp xếp dữ liệu trước khi đưa chúng vào một mảng? – Hanseh

+0

Có kết quả nhưng là kết quả của một công cụ tìm kiếm/thư mục để kết quả dựa trên cách hiệu quả nhất để nhận kết quả liên quan từ truy vấn –

+0

Đó là * nghề * với một * f * nhưng hai * s *. – Gumbo

Trả lời

6

Đây chính là nơi 's PHParray_multisort nói đến sử dụng. Đó là trường hợp bạn muốn sắp xếp nhiều mảng dựa trên sự so sánh xảy ra chỉ trong một trong số chúng.

Tôi đã sửa đổi mảng score để có các giá trị khác biệt.

<?php 

$arr = array(
       'display_name' => array('ACT_Web_Designs','user1_design','user2_design'), 
       'proffesion' => array('Web Developer','web developer','web developer'), 
       'score' => array(12,6,15), 
       'img' => array('./?0000=gif&0001=3fadb8c362ff39f3322909899ff14760&0002=prof_pic','','') 
      ); 

var_dump($arr); 
array_multisort($arr['score'], SORT_ASC, SORT_NUMERIC, 
       $arr['display_name'], 
       $arr['proffesion'], 
       $arr['img'] 
       ); 
var_dump($arr); 


?> 

Here goes a working demo.

+0

Bạn đã bao giờ có cảm giác rằng PHP có quá nhiều chức năng sắp xếp? Tất cả những gì bạn cần làm là tìm ra đúng và mọi vấn đề của bạn biến mất. Tôi đã học được một cái mới hôm nay, cảm ơn bạn. –

+0

@Christian: Đồng ý, có rất nhiều chức năng phân loại. Mỗi một là cho một vấn đề nhất định để giải quyết. Tốt là chúng ta không phải viết chức năng sắp xếp của riêng chúng ta hầu hết thời gian. – codaddict

0

Nó không hoạt động với chỉ rsort mảng điểm số?

rsort($data['score'], SORT_NUMERIC); 
+0

không, chỉ là mảng điểm. –

0

Tôi đã quản lý để làm điều này, tôi chỉ sau một cách hiệu quả hơn;

$array = array(
      'display_name' => array(0 => 'ACT_Web_Designs', 1 => 'user1_design', 2 => 'user2_design'), 
      'proffesion' => array(0 => 'Web Developer', 1 => 'web developer', 2 => 'Web Developer'), 
      'score' => array(0 => 15, 1 => 6, 2 => 15), 
      'img' => array(0 => './?0000=gif&0001=3fadb8c362ff39f3322909899ff14760&0002=prof_pic', 1 => '', 2 => '') 
); 

arsort($array['score'], SORT_NUMERIC); 
foreach($array['score'] as $key => $val) { 
    $newarray['display_name'][] = $array['display_name'][$key]; 
    $newarray['proffesion'][] = $array['proffesion'][$key]; 
    $newarray['score'][] = $array['score'][$key]; 
    $newarray['img'][] = $array['img'][$key]; 
} 

print_r($newarray); 

lợi nhuận

Array 
(
    [display_name] => Array 
     (
      [0] => ACT_Web_Designs 
      [1] => user2_design 
      [2] => user1_design 
     ) 

    [proffesion] => Array 
     (
      [0] => Web Developer 
      [1] => Web Developer 
      [2] => web developer 
     ) 

    [score] => Array 
     (
      [0] => 15 
      [1] => 15 
      [2] => 6 
     ) 

    [img] => Array 
     (
      [0] => ./?0000=gif&0001=3fadb8c362ff39f3322909899ff14760&0002=prof_pic 
      [1] => 
      [2] => 
     ) 

) 
0

này sẽ không tái sắp xếp chúng cho bạn, nhưng nó sẽ cho phép bạn đi qua chúng theo thứ tự bạn muốn. Bạn có thể gán lại chúng nếu bạn muốn, nhưng tôi chỉ sử dụng nó cho thứ tự đầu ra.

Chỉnh sửa: Điều này sẽ không hoạt động, do khả năng giá trị khóa không phải duy nhất. Xem nhận xét dưới đây, và học hỏi từ sai lầm của tôi

$sort_order = $array['score']; 
arsort($sort_order); 
$sort_order = array_flip($sort_order); 
foreach($sort_order as $key){ 
    echo $array['display_name'][$key].' - '.$array['score'][$key]; 
}
+0

Chúng tôi có ý tưởng tương tự! Tuy nhiên, bạn đã gặp phải sự cố bằng cách sử dụng array_flip vì điểm số không được đảm bảo là duy nhất. Xem câu trả lời của tôi cho biến thể của tôi. – erisco

+0

Ah, tôi thấy vấn đề. Cảm ơn bạn đã thẳng thắn với tôi;) –

1

Làm thế nào về đơn giản hơn một

$arr = array("k"=>array("A","B","C"),"l"=>array(15,6,15),"n"=>array("k","l","n")); 
array_multisort($arr["k"],SORT_NUMERIC,SORT_DESC,$arr["l"],$arr["n"]); 
var_dump($arr); 
0

Sử dụng rsort này()

<?php 
$fruits = array("lemon", "orange", "banana", "apple"); 
rsort($fruits); 
reset($fruits); 
while (list($key, $val) = each($fruits)) { 
    echo "$key = $val\n"; 
} 
?> 

Ví dụ này sẽ hiển thị:

0 = orange 
1 = lemon 
2 = banana 
3 = apple 
0

Giải pháp thanh lịch nhất mà tôi có thể tìm thấy sẽ không sắp xếp lại cấu trúc dữ liệu mà chỉ truy cập nó theo một cách khác.

$scores = $data['score']; 
arsort($scores); 
$keys_ordered_by_score = array_keys($scores); 

Bây giờ bạn có thể, ví dụ, lấy display_name và "proffesion" có số điểm cao nhất bởi những điều sau đây:

$first_place = $keys_ordered_by_score[0]; 
echo $data['display_name'][$first_place], 
    ' is a ', $data['proffesion'][$first_place]; 

Tất nhiên, nếu bạn thực sự cần phải sắp xếp lại các cấu trúc dữ liệu , ý tưởng này là vô dụng đối với bạn. Bất kỳ câu trả lời nào khác sử dụng array_multisort() có thể sẽ phù hợp với nhu cầu đó.

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