php数组排序有两种方式

时间:2012-11-08 22:29:20

标签: php arrays sorting

我有一个数组:

$arr = array(

    'Alcatel' => '0',
    'Apple' =>   '4542',
    'LG' =>      '0',
    'Nokia' =>   '0',
    'Samsung' => '2760',
    'Siemens' => '0',
    'Sony' =>    '0',

);

所有键都按字母顺序排列,但值不是。 我想要: 1-保持联想 2-按值HIGH到LOW排序数组 3-维护零值条目的字母顺序

得到:

$arr = array(

    'Apple' =>   '4542',
    'Samsung' => '2760',
    'Alcatel' => '0',
    'LG' =>      '0',
    'Nokia' =>   '0',
    'Siemens' => '0',
    'Sony' =>    '0',

);

现在当我使用arsort($ arr);

我得到了:

$arr = array(
  'Apple' =>   '4542',
  'Samsung' => '2760',
  'Siemens' => '0',
  'Sony' =>    '0',
  'Nokia' =>   '0',
  'LG' =>      '0',
  'Alcatel' => '0',
);

所以我得到了目标1和2而不是3

有什么建议吗?

感谢。

2 个答案:

答案 0 :(得分:0)

好的,我终于做到了:

因为$ arr是2个数组,$ titles和$ values的组合:

array_multisort($values, SORT_DESC, $titles, SORT_ASC, $arr);

这终于有效了!

答案 1 :(得分:0)

对于更一般的情况,如果您没有在单独的源数组中使用的键和值,则需要自定义比较函数。有sort个版本将键传递给比较函数,以及传递值的版本,但是你需要两个版本,并且没有一个版本传递这两个版本。

由于uksort传递了密钥,您可以查找值,但是如果访问从比较函数中排序的数组,则会得到不可靠的结果和来自PHP的警告。所以你需要复制一份。

我能想到的最干净的解决方案是将副本/访问包装在一个闭包中(所以这需要5.4):

$arr = array(
    'Alcatel' => '0',
    'Apple' =>   '4542',
    'LG' =>      '0',
    'Nokia' =>   '0',
    'Samsung' => '2760',
    'Siemens' => '0',
    'Sony' =>    '0',
  );

  function mkcmp($arr) {
    return function($k1, $k2) use ($arr) {
      $v1 = $arr[$k1];
      $v2 = $arr[$k2];

      if ($v1 > $v2) {
        return -1;
      } else if ($v1 < $v2) {
        return 1;
      } else if ($k1 < $k2) {
        return -1;
      } else if ($k1 == $k2) {
        return 0;
      } else {
        return 1;
      }
    };
  }

  uksort($arr, mkcmp($arr));

以下是排序后print_r($arr)的输出:

Array
(
    [Apple] => 4542
    [Samsung] => 2760
    [Alcatel] => 0
    [LG] => 0
    [Nokia] => 0
    [Siemens] => 0
    [Sony] => 0
)