2012-06-16 47 views
10

考虑以下关联数组多类型的关联数组在PHP

$arr = Array 
(  
    [banana] => 2 
    [cherry] => 1 
    [orange] => 3 
    [grapefruit] => 1 
    [apple] => 1 
) 

我想它的方式,将类似于PLSQL项排序:A DESC, B ASC (其中A是值和B是关键)含义:

​​

使橙子和香蕉是第一,因为价值的,但后来我有苹果,樱桃和葡萄柚按字母顺序排列,因为它们具有相同的值。

我的尝试:
1.运行ksort()然后asort()/rsort()希望第二类将橙子和香蕉一下子提高到数组的开头没有搞乱字母排序其他3项。我错了。它确实把所有东西都弄乱了。所以我检查出:
2. sort functionsarray_multisort()。但显然它一次排列几个数组,或者是一个多维数组。
3.我也试图定义以下比较功能:

function cmp($a, $b) 
{ 
    foreach ($a as $key1 => $val1) { 
     foreach ($b as $key2 => $val2) { 
      if($val1 == $val2){ 
       return strcmp($key1,$key2); 
      } 
      else if ($val1 > $val2){ 
       return 1; 
      } 
      else{ // $val1 < $val2 
       return -1; 
      } 
     } 
    }  
} 

usort()调用它,但它也没有工作。

所以我的问题是:是否有PHP方法实现请求的行为?

对于欧根:
我试了一下,并没有分选前工作 :

Array 
(
    [lamb] => 3 
    [rule] => 1 
    [children] => 1 
    [teacher] => 2 
    [eager] => 1 
) 

和排序后:

Array 
(
    [children] => 1 
    [eager] => 1 
    [rule] => 1 
    [teacher] => 2 
    [lamb] => 3 
) 
+0

您将如何使用所产生的阵列? – Galen

+0

@Galen以一种非常复杂和强大的方式,从来没有在地球上看到;) – alfasin

+1

关于你的第一种方法,它不工作,因为PHP排序不稳定(即保持相同的值的顺序)。 – Sarke

回答

12

您可以使用array_multisort

<?php 
    $arr = Array 
    (  
     'banana' => 2, 
     'cherry' => 1, 
     'orange' => 3, 
     'grapefruit' => 1, 
     'apple' => 1 
    ); 

    $values = array_values($arr); 
    $keys = array_keys($arr); 

    //first sort by values desc, then sort by keys asc 
    array_multisort($values, SORT_DESC, $keys, SORT_ASC, $arr); 

    print_r($arr); 
    // output: 
    /* 
    Array 
    (
     [orange] => 3 
     [banana] => 2 
     [apple] => 1 
     [cherry] => 1 
     [grapefruit] => 1 
    ) 
    */ 

?> 

它的工作原理是这样的:

  • 为用于(为你的值和键)进行排序,其内容创造新的一维数组
  • 通过那些一维数组中的排序,以在array_multisort函数每一列为了(使$值,然后再$键),添加排序顺序为每个阵列
  • 的最后一个参数必须是要排序

数组(或许你会觉得this explanation更容易理解)使用

+0

我不知道你为什么得到-1,你得到了我的+1,因为你的解决方案确实有效,谢谢! – alfasin

+2

@alfasin谢谢:),people're如此之快在downvoting和不事件解释为什么... – Zbigniew

+0

如果我们想要为每个我们要排序的元素添加多个排序标志,它会工作吗? –

3
function polysortcmp($a, $b) { 
    if ($a[1]<$b[1]) return 1; 
    if ($a[1]>$b[1]) return -1; 
    if ($a[0]<$b[0]) return -1; 
    if ($a[0]>$b[0]) return 1; 
    return 0; 
} 


function polysort(&$arr) { 
    foreach ($arr as $k=>$v) $arr[$k]=array($k,$v); 
    uasort($arr, "polysortcmp"); 
    foreach ($arr as $k=>$v) $arr[$k]=$v[1]; 
} 
+0

它不起作用。我更新这个问题,告诉你如果我按照自己的方式尝试,结果会是什么。 – alfasin

+0

对不起,您误解了我:我先按键排序,然后值 - 更新我的答案。 –

+0

现在它按字母顺序排序,但VALUES以ASC顺序而不是DESC。我更新了我的问题,向您展示了代码的当前输出。你可以拿我给的例子运行它。 – alfasin

0

数组排序功能arsort ..

$arr = array(  
     'banana' => 2, 
     'cherry' => 1, 
     'orange' => 3, 
     'grapefruit' => 1, 
     'apple' => 1 
    ); 

arsort($arr); 
print_r($arr); 

输出

Array ([orange] => 3 [banana] => 2 [apple] => 1 [grapefruit] => 1 [cherry] => 1) 
+0

我试过arsort(),它不起作用。它可能适用于我给出的具体示例 - 但它不适用于一般情况。 – alfasin