0

我有一个数组:

$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

有什么建议吗?

谢谢。

4

2 回答 2

0

Ok, I finally did it:

Because $arr is a combination of 2 arrays, $titles and $values:

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

this finally works!

于 2012-11-08T22:58:33.783 回答
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
)
于 2012-11-09T14:29:48.870 回答