按多个规则对平面数组进行排序
Sort flat array by multiple rules
我需要一些关于我的数组排序函数的帮助,因为它没有按我预期的那样工作。
此函数是将数组[0,1,2,3,4,...23]排序为数组[9,10,11,12,...,23,0,1,2 ,3,4,5,6,7,8],我正计划集成此功能以对矩阵中的数据进行排序 table。
我不明白为什么值 [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>";
}
?>
您似乎想按位数反向排序整数,然后在每个数字计数组中按顺序排序。此外,还有一个特殊限制,即 9 算作 double-digit 个数字。
此函数生成预期的输出,但可能需要修改以处理测试用例中不明显的条件,例如数字 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
}
根据需要使用 3 向比较,并在出现平局时回退到下一个排序标准。
- 按“if 9”排序(ASC 排序时
false
在true
之前)
- 然后按字符串长度DESC排序
- 然后按值ASC排序
代码:(Demo)
usort(
$array,
fn($a, $b) =>
($a !== 9) <=> ($b !== 9)
?: strlen($b) <=> strlen($a)
?: $a <=> $b
);
var_export($array);
我需要一些关于我的数组排序函数的帮助,因为它没有按我预期的那样工作。
此函数是将数组[0,1,2,3,4,...23]排序为数组[9,10,11,12,...,23,0,1,2 ,3,4,5,6,7,8],我正计划集成此功能以对矩阵中的数据进行排序 table。
我不明白为什么值 [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>";
}
?>
您似乎想按位数反向排序整数,然后在每个数字计数组中按顺序排序。此外,还有一个特殊限制,即 9 算作 double-digit 个数字。
此函数生成预期的输出,但可能需要修改以处理测试用例中不明显的条件,例如数字 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
}
根据需要使用 3 向比较,并在出现平局时回退到下一个排序标准。
- 按“if 9”排序(ASC 排序时
false
在true
之前) - 然后按字符串长度DESC排序
- 然后按值ASC排序
代码:(Demo)
usort(
$array,
fn($a, $b) =>
($a !== 9) <=> ($b !== 9)
?: strlen($b) <=> strlen($a)
?: $a <=> $b
);
var_export($array);