usort函数无法按预期工作

时间:2018-03-23 04:55:13

标签: arrays sorting usort

我想对数组的排序函数提供一些帮助,因为它没有像我预期的那样工作。

此函数用于将[0,1,2,3,4,... 23]数组排序为数组[9,10,11,12,...,23,0,1,2,3 ,4,5,6,7,8],我打算集成这个函数来对矩阵表中的数据进行排序。

我无法弄清楚为什么值[0,1,2]不合适。

以下是代码:

<?php
function cmp($a, $b)
{
if ($a == $b) return 0;
if ($a == 9) return -1;
if ($b == 9) return 1;
return strcmp($a, $b);
}
$a = array(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23);
echo'<br>';
usort($a, "cmp");

//print_r($a);
echo '<pre>';print_r($a);echo '</pre>';

$arrlength=count($a);
for($x=0;$x<$arrlength;$x++)
{
echo $a[$x];
echo "<br>";
}
?>

1 个答案:

答案 0 :(得分:0)

您似乎希望按相反的位数对整数进行排序,然后按顺序在每个数字计数组内排序。此外,还有一个特殊约束,即9计为两位数字。

此函数生成预期输出,但可能需要修改以处理测试用例中不明显的条件,例如数字90及以上(但是从注释中,这与时间有关,所以它可能就足够了):

function cmp($a, $b) {

  // Handle nines
  if ($a == 9) { return -1; }
  if ($b == 9) { return 1;  }

  // Perform a comparison by digit count
  $cmp = strcmp(strlen($a), strlen($b));

  if ($cmp === 0) { // Same digit count, sort sequentially
    return $a - $b; 
  }

  return -$cmp; // Different digit counts; sort in reverse
}