PHP中的多类关联数组

PHP中的多类关联数组,php,arrays,sorting,Php,Arrays,Sorting,考虑以下关联数组 $arr = Array ( [banana] => 2 [cherry] => 1 [orange] => 3 [grapefruit] => 1 [apple] => 1 ) 我想以类似于PLSQL术语的方式对其进行排序:a DESC,B ASC (其中A为数值,B为键)表示: 橘子和香蕉首先是因为它们的价值,然后我有苹果,樱桃和葡萄柚,按字母顺序排列,因为它们的价值相同 我的尝试: 一

考虑以下关联数组

$arr = Array
(        
    [banana] => 2
    [cherry] => 1
    [orange] => 3
    [grapefruit] => 1
    [apple] => 1
)
我想以类似于PLSQL术语的方式对其进行排序:
a DESC,B ASC
(其中A为数值,B为键)表示:

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

我的尝试:
一,。运行,然后/希望第二个排序将把橙色和香蕉添加到数组的开头,而不会弄乱其他3项的字母排序。我错了。它确实把一切都搞砸了。所以我退房了:
2。和。但很明显,它同时对多个数组进行排序,或者是一个多维数组。
三,。我还尝试定义以下比较函数:

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;
            }
        }
    }    
} 
分类后:

Array
(
    [children] => 1
    [eager] => 1
    [rule] => 1
    [teacher] => 2
    [lamb] => 3
)
函数polysortcmp($a,$b){
如果($a[1]$b[1])返回-1;
如果($a[0]$b[0])返回1;
返回0;
}
函数polysort(&$arr){
foreach($arr as$k=>$v)$arr[$k]=数组($k,$v);
uasort($arr,“polysortcmp”);
foreach($arr as$k=>$v)$arr[$k]=$v[1];
}
您可以使用


它的工作原理如下:

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

(也许您会发现更容易理解)

使用了数组排序函数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 ) 

您将如何使用生成的阵列?@Galen以一种在地球上从未见过的非常复杂和强大的方式;)关于第一种方法,它不起作用,因为PHP排序不稳定(即保持相等值的顺序)。我更新问题是为了告诉你如果我按你的方式尝试,结果会是什么。对不起,误读了你:我先按键排序,然后按值-更新了我的答案。现在它按字母顺序排序,但值按ASC顺序而不是DESC。我更新问题是为了告诉你代码的当前输出。你可以拿我举的例子来运行它。好的,第三次是魅力,再次更新我的答案。供您参考:排序顺序在
polysortcmp()
中,
$a[1]
是值,
$a[0]
是键。我不知道您为什么得到-1,您从我这里得到+1,因为您的解决方案确实有效,谢谢@alfasin谢谢:),人们的下表决速度如此之快,事件不解释为什么…如果我们想为每个要排序的元素添加多个排序标志,它会起作用吗?我尝试了arsort(),但它不起作用。它可能适用于我给出的特定示例,但不适用于一般情况。
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];
}
<?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
    )
    */

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