PHP - 排序字母数字键的更有效方法

标签 php arrays sorting

注意:我编辑了示例并将所有值替换为 1。值无关紧要,只有键有关系。我之前写的值导致了误解。对不起。

注意:a/b block 始终是连续的。我添加这个是因为它不清楚。如果有 3a/3b 和 5a/5b,总会有 4a/4b 而不仅仅是 4。

我的数组包含带前导零的编号键。有时,这些带编号的键有两种变体,我使用后缀 a 和 b 来区分它们。有或没有变化的 key 数量未知,但永远不会超过 2 位数字;即最高数字键是“09”。

问题是这些数组键需要按数字排序,但是当存在后缀时,那些应该优先。单独使用 ksort() 无法实现此目的。

例如,ksort() 给我这个:

$arr = array(
    '01' => 1,
    '02' => 1,
    '03a' => 1,
    '03b' => 1,
    '04a' => 1,
    '04b' => 1,
    '05a' => 1,
    '05b' => 1,
    '06' => 1,
);

但是,我需要这个:

$arr = array(
    '01' => 1,
    '02' => 1,
    '03a' => 1,
    '04a' => 1,
    '05a' => 1,
    '03b' => 1,
    '04b' => 1,
    '05b' => 1,
    '06' => 1,
);

我使用了一些花哨的编码体操来获得我想要的东西,但它并不漂亮。我想知道是否有更好、更简洁的方法?


这是我的做法。

1) 我使用 ksort() 得到上面两个数组中的第一个。 (这还不是我想要的。)

2) 我创建了两个数组。一个用于“a”后缀,另一个用于“b”后缀。

$arr_a = array();
$arr_b = array();

foreach ($arr as $k => $v) {
    if (substr($k, 2) == 'a') {
        $arr_a[$k] = $v;
    } else if (substr($k, 2) == 'b') {
        $arr_b[$k] = $v;
    }
}

3) 我合并两个后缀数组。

$arr_suffixes = array_merge($arr_a, $arr_b);

4) 我将原始数组切分,以便获得后缀之前的部分和后缀之后的部分。

$i = array_search(key($arr_suffixes), array_keys($arr));
$length = count($arr_suffixes);

$arr_before_suffixes = array_slice($arr, 0, $i);
$arr_after_suffixes = array_slice($arr, $i + $length);

5) 使用 array_merge,我重新组合切片数组以创建我需要的数组。

$arr = array_merge($arr_before_suffixes, $arr_suffixes);
$arr = array_merge($arr, $arr_after_suffixes);

最后,我们得到了正确的 $arr。有没有更好的方法来做到这一点?感觉真的很丑。

最佳答案

您没有正式的规则。我会尝试猜测。

$arr = array(
    '01' => 1,
    '02' => 1,
    '03a' => 1,
    '03b' => 1,
    '04a' => 1,
    '04b' => 1,
    '05a' => 1,
    '05b' => 1,
    '06' => 1,
);

uksort($arr, function($item1, $item2)
    {
    $last1 = substr($item1, -1);
    $last2 = substr($item2, -1);
    // one of the items is a number or last letters matches
    if (is_numeric($last1) || is_numeric($last2) || $last1 == $last2) 
        // simple number comparison
        return $item1 - $item2;
    else
        // natural order comparison
        return $last1 > $last2 ? 1 : -1;
    });

var_dump($arr);

关于PHP - 排序字母数字键的更有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25842753/

相关文章:

php - 500 内部服务器错误 Ajax Laravel

php - 为什么 Symfony2 在基准测试中表现如此糟糕,这很重要吗?

c++ - [C++][std::sort] 它如何在 2D 容器上工作?

mysql - 按最常见的 product_id 对已售出表进行排序

一旦我添加 'echo' 并从表中获取一些内容,PHP (MySQL) 脚本就不会读取任何其他内容

php - 想要使用底层 C++ 构建基于浏览器的 Web 应用程序,我在看 AJAX、LAMP 吗?

c# - 如何将多维 (2D) 数组按行分成多个一维数组?

c - 在 while 循环中将值存储在数组中

java - 从某个索引通过引用传递数组

java - 是否有广泛使用的 Java NavigableMap 接口(interface)的 C++ 版本?