2010-04-23 93 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()的任何其他答案都可能适合该需求。

相关问题