问题 PHP中的多种关联数组


考虑以下关联数组

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

所以橙色和香蕉是第一个因为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;
            }
        }
    }    
} 

并称之为 usort() 但它也没有用。

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

对于欧根:
我尝试过它并没有用 排序前:

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

并在排序后:

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

6835
2018-06-16 08:39


起源

您将如何使用生成的数组? - Galen
@Galen以非常复杂和强大的方式在地球上从未见过;) - alfasin
关于你的第一种方法,它没有用,因为PHP排序不稳定(即维持相等值的顺序)。 - Sarke


答案:


您可以使用 在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
    )
    */

?>

它的工作原理如下:

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

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


12
2018-06-16 09:01



我不知道你为什么得到-1,你得到了+1,因为你的解决方案确实有效,谢谢! - alfasin
@alfasin谢谢:),人们在downvoting这么快,并没有事件解释为什么... - Zbigniew
如果我们想为每个要排序的元素添加多个排序标志,它会起作用吗? - Paris Char
@ParisChar你能告诉我们你的数据吗? - Zbigniew


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];
}

3
2018-06-16 08:53



它不起作用。我更新问题,以便向您展示如果我按照您的方式尝试的结果。 - alfasin
对不起,误读了你:我先按键排序,再按值排序 - 更新我的回答。 - Eugen Rieck
现在它按字母顺序排序,但VALUES是ASC顺序而不是DESC。我更新了我的问题,以向您显示代码的当前输出。您可以采用我给出的示例并运行它。 - alfasin
好的,第三次是魅力,再次更新了我的答案。有关您的信息:排序顺序在 polysortcmp() 同 $a[1] 是价值和 $a[0] 是关键。 - Eugen Rieck
你是对的!第三次确实是魅力:) - alfasin


数组排序函数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
2018-06-16 10:04



我尝试了arsort()并且它不起作用。它可能适用于我给出的具体例子 - 但它不适用于一般情况。 - alfasin