php - 如何按照规定的顺序排序:小写、大写、数字和符号?
问题描述
我是 PHP 新手,正在尝试解决涉及排序的编程问题。我想解决这个输入和输出如下的问题。
排序前:6Ata7~58jh&*(*HLy^)&a[yjJ>8]G8,$9<Y;B:%^
排序后:jhytaayjYBJGAHL8968758~& ( ^)&[>],$<;:%^
我需要帮助了解如何根据标题中提到的订单状态进行排序,以及如何从上述输入和输出中获得相同的结果。以下是我正在处理的代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Test</title>
</head>
<body>
<form name="form1" id="form1" method="post" action="<?php $_SERVER['PHP_SELF'] ?>">
<h5>Custom Sorts Self Test</h5>
<label>Insert Characters You Want to Sort
<input type="text" name="input" id="input">
</label>
<input type="submit" value="Submit">
</form>
<h1>Result</h1>
<?php
function reverseString($string){
$stringlen = strlen($string) - 1;
$split_str = str_split($string, 1);
$array = array();
for($i = 0; $i <= $stringlen; $i++){
array_push($array, $split_str[$i]);
}
rsort($array, SORT_STRING | SORT_NUMERIC | SORT_FLAG_CASE | SORT_NATURAL);
return $array;
}
if(isset($_POST['input']) && !empty($_POST['input'])){
echo '<pre>';
echo 'Before sort: ';
print_r($_POST['input']);
echo '<br>--------------------<br>';
echo 'After sort:' ;
print_r(reverseString($_POST['input']));
echo '</pre>';
}
?>
</body>
</html>
解决方案
一种选择是使用 lambda 函数对字符串字符数组进行排序。我们可以usort()
在数组上使用一个帮助函数get_rank()
返回一个从 1 到 4 的值,具体取决于字符是小写字母、大写字母、数字还是其他任何字符(包括符号)。
function get_rank($letter) {
if (ctype_lower($letter)) {
return 1;
}
else if (ctype_upper($letter)) {
return 2;
}
else if (is_numeric($letter)) {
return 3;
}
else {
return 4;
}
}
$input = "6Ata7~58jh&*(*HLy^)&a[yjJ>8]G8,$9<Y;B:%^";
echo $input . "\n";
$letters = str_split($input);
usort($letters, function($a, $b) {
return get_rank($a) > get_rank($b);
});
$output = implode("", $letters);
echo $output;
这打印:
6Ata7~58jh&*(*HLy^)&a[yjJ>8]G8,$9<Y;B:%^
ajyjhatyYBAGJHL9886875,%:;~<$&)&]*>(*^[^
请注意,您没有指定在小写、符号等组内进行排序的任何逻辑。可以修改上述逻辑以包含此逻辑。
推荐阅读
- arrays - 如何避免在循环时跳过数组的元素
- c# - 从列表框控件构建 SQL IN 语句 Return Nothing
- php - 将上传文件夹更改为另一个文件托管服务?
- .net - Powershell 中的内部 CLR 错误 (0x80131506) 和崩溃
- mongodb - 如何在父级显示相关文档的数量?
- laravel - 通过laravel中的关系获取数据
- python - 无法通过append函数提取串行执行结果
- npm - 为什么我不能运行“npm run sass”?
- excel-formula - 在 Excel 中将数字范围分数转换为字母等级
- go - 将 Go Modules 与需要“make install”的包一起使用