首页 > 解决方案 > 如何按照规定的顺序排序:小写、大写、数字和符号?

问题描述

我是 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>

标签: php

解决方案


一种选择是使用 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,%:;~<$&)&]*>(*^[^

请注意,您没有指定在小写、符号等组内进行排序的任何逻辑。可以修改上述逻辑以包含此逻辑。


推荐阅读