【问题标题】:usort function in phpphp中的排序功能
【发布时间】:2018-10-14 22:02:22
【问题描述】:

为什么下面sn-p中的usort函数不仅按照'num'键的值降序对矩阵进行排序,而且还对'num'键的值相等的元素按值排序'lett' 键按升序排列?如何仅按函数主体中给出的内容对其进行排序?

<?php
$mtx = [["num"=>1,"lett"=>"f"], 
        ["num"=>3,"lett"=>"b"], 
        ["num"=>3,"lett"=>"a"]
];

usort($mtx, function($a,$b) { 
                 if($a['num']<$b['num']) return 1;
                 if($a['num']>$b['num']) return -1;
      });

var_dump($mtx);
/*
  array(3) { [0]=> array(2) { ["num"]=> int(3) ["lett"]=> string(1) "a" } 
             [1]=> array(2) { ["num"]=> int(3) ["lett"]=> string(1) "b" } 
             [2]=> array(2) { ["num"]=> int(1) ["lett"]=> string(1) "f" } 
  } 
*/

【问题讨论】:

  • @Jeff 应该是 return $b['num'] - $a['num'];
  • 哎呀,真的。我认为 usort 需要一个布尔值作为返回值。然后我会删除我的评论...
  • @Jeff 见this。这实际上在很多情况下都有效,奇怪的是,它并不完全可靠:)

标签: php arrays sorting


【解决方案1】:

对数组进行排序将尝试将每个项目与其他项目进行排序,因此即使这些项目相等,您也不能强制 usort(它只为您提供值)保持项目的原始顺序。

但是,您可以使用uksort,它也可以让您访问密钥(来自原始数组),让您回退到那个:

uksort($mtx, function ($key1, $key2) use ($mtx) {
  $a = $mtx[$key1];
  $b = $mtx[$key2];

  if ($a['num'] < $b['num']) {
    return 1;
  }
  if ($a['num'] > $b['num']) {
    return -1;
  }

  return $key1 - $key2;
});

更短的形式:

uksort($mtx, function ($key1, $key2) use ($mtx) {
  return $mtx[$key2]['num'] - $mtx[$key1]['num'] ?: $key1 - $key2;
});

【讨论】:

    猜你喜欢
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-30
    • 1970-01-01
    相关资源
    最近更新 更多