12

考虑以下关联数组

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

我想以类似于 PLSQL 术语的方式对其进行排序:(A DESC, B ASC 其中 A 是值,B 是键)含义:

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

所以橙子和香蕉首先是因为价值,然后我有苹果,樱桃和葡萄柚按字母顺序排列,因为它们具有相同的价值。

我尝试了什么:
1. 运行ksort( )然后asort() / rsort()希望第二个排序将橙色和香蕉撞到数组的开头,而不会弄乱其他 3 个项目的字母排序。我错了。它确实把一切都搞砸了。所以我检查了:
2.排序函数array_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 方法?

对于 Eugen:
我试过了,但在排序之前它不起作用:

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

排序后:

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

3 回答 3

13

您可以使用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 函数(所以首先是 $values,然后是 $keys),为每个数组添加排序顺序
  • 最后一个参数必须是要排序的数组

(也许你会发现这个解释更容易理解)

于 2012-06-16T09:01:56.907 回答
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];
}
于 2012-06-16T08:53:47.553 回答
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 ) 
于 2012-06-16T10:04:43.533 回答