PHP中的多种关联数组

alf*_*sin 12 php arrays sorting

考虑以下关联数组

$arr = Array
(        
    [banana] => 2
    [cherry] => 1
    [orange] => 3
    [grapefruit] => 1
    [apple] => 1
)
Run Code Online (Sandbox Code Playgroud)

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

$arr = Array
(
    [orange] => 3
    [banana] => 2
    [apple] => 1
    [cherry] => 1
    [grapefruit] => 1        
)
Run Code Online (Sandbox Code Playgroud)

所以橙色和香蕉是第一个因为VALUE,但我按字母顺序排列苹果,樱桃和葡萄柚,因为它们具有相同的价值.

我试了一下:
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;
            }
        }
    }    
} 
Run Code Online (Sandbox Code Playgroud)

并用usort()调用它,但它也没有用.

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

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

Array
(
    [lamb] => 3
    [rule] => 1
    [children] => 1
    [teacher] => 2
    [eager] => 1
)
Run Code Online (Sandbox Code Playgroud)

并在排序后:

Array
(
    [children] => 1
    [eager] => 1
    [rule] => 1
    [teacher] => 2
    [lamb] => 3
)
Run Code Online (Sandbox Code Playgroud)

Zbi*_*iew 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
    )
    */

?>
Run Code Online (Sandbox Code Playgroud)

它的工作原理如下:

  • 对于用于排序的每个列(为您的值和键),使用其内容创建新的1d数组
  • 在排序顺序中将这些1d数组传递给array_multisort函数(首先是$ values,然后是$ keys),为每个数组添加排序顺序
  • 最后一个参数必须是要排序的数组

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

  • @alfasin谢谢:),人们在downvoting这么快,并没有事件解释为什么... (3认同)