2010-04-23 119 views
6

我已經編寫了一個腳本來生成一個數據數組,但現在想按照分數順序顯示。陣列輸出如下;如何在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] => 
    ) 

所以簡而言之,我希望它被轉換如下;

[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] => 
    ) 

我一直在看asort(),但不能得到任何工作。任何幫助將非常感激。

+1

是來自數據庫的數據?也許你可以在將數據放入數組之前對數據進行排序? – Hanseh 2010-04-23 06:30:36

+0

是的結果是,但它的目錄/搜索引擎,所以結果是基於從查詢中獲得相關結果的最有效的方式。 – 2010-04-23 06:42:34

+0

它是*職業*有一個* f *但兩個* s *。 – Gumbo 2010-04-23 06:45:21

回答

6

學習這正是該PHParray_multisort來使用。在這種情況下,您想根據其中一箇中發生的比較對許多數組進行排序。

我修改了數組score以具有不同的值。

<?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

你有沒有感覺到PHP有太多的排序功能?你所需要做的就是找到合適的人,所有的問題都會消失。 今天我學了一個新東西,謝謝。 – 2010-04-23 07:58:27

+0

@Christian:同意,有許多排序功能。每一個都是爲了解決某個問題。這很好,我們大多數時候不必編寫自己的排序函數。 – codaddict 2010-04-23 09:23:29

0

難道它只適用於rsort得分數組嗎?

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

不,只是得分數組。 – 2010-04-23 06:38:37

0

我已經設法做到了這一點,我只是以更有效的方式;

$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); 

回報

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

你這會不會重新排序,但它會讓你去通過他們你想要的順序。如果需要,您可以重新分配它們,但我只是將它用於輸出順序。

編輯:由於非唯一鍵值的可能性,這不起作用。請參見下面的註釋,並從我的錯誤

$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

我們有同樣的想法!但是,使用array_flip會遇到問題,因爲分數不保證是唯一的。查看我的答案以瞭解我的變化。 – erisco 2010-04-23 07:15:26

+0

啊,我看到了問題。感謝您理清我; – 2010-04-24 00:44:12

1

這個怎麼樣簡單的一個

$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

使用rsort()

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

這個例子將顯示:

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

我能找到的最優雅的解決方案不會重新排序數據結構,而只是以不同的方式訪問它。

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

現在你可以說,抓住具有由下列分數最高的DISPLAY_NAME和「proffesion」:

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

當然,如果你真的需要重新排序的數據結構,這個想法對你來說毫無用處。使用array_multisort()的任何其他答案都可能適合該需求。