首页 > 解决方案 > php中的排序功能

问题描述

为什么以下代码段中的 usort 函数不仅按“num”键的值按降序对矩阵进行排序,而且还按“lett”的值对“num”键的值相等的元素进行排序键按升序排列?如何仅按函数主体中给出的内容对其进行排序?

<?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" } 
  } 
*/

标签: phparrayssorting

解决方案


对数组进行排序将尝试将每个项目与其他项目进行排序,因此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;
});

推荐阅读