【问题标题】:Help with custom sort in php帮助在 php 中进行自定义排序
【发布时间】:2011-05-05 14:46:02
【问题描述】:

我正在尝试对数组进行排序,例如

$arr =('1000'=>'DUMMY',
       '100001'=>'DUMMY1',
       '100002'=>'DUMMY3',
       '100004'=>'DUMMY4',
       '1001'=>'TEST',
       '100100'=>'test1',
       '100102'=>'DUMMY123');

排序后的结果应该是这样的

'1000'=>'DUMMY'
'100001'=>'DUMMY1'
'100002'=>'DUMMY3'
'100004'=>'DUMMY4'
'1001'=>'TEST'
'100100'=>'test1'
'100102'=>'DUMMY123'

值和键都应该是字符串。

有什么帮助吗?非常感谢

*******更新* *****

嗯,可能我被误解了。我会尽量提供更多细节。

用户输入两个字段(两个字符串)。第一个是数字,第二个是字母数字。所以前面提到的数组就被构造出来了。第一个字段是指一个(唯一的)id,而第二个是这个 id 的描述。

ID 遵循以下模式:

有些“基本”ID 由 4 位数字组成。让我们将它们命名为“类别”。这些 id 被分析为其他一些 id(子类别)。每个子类别都有两个数字,我们将它们添加到类别 ID 的末尾。一个例子:

10.00 (cars)
  10.00.01 (blue cars)
    10.00.01.01 (blue cars, trucks)
    10.00.01.02 (blue cars, buses)
10.00.02 (red cars)
   10.00.02.01 (red cars, trucks)

.... 等等

用户添加/编辑/删除类别/子类别。应该得到排序后的数组,例如示例。

有什么帮助吗?

非常感谢

【问题讨论】:

  • 我是否遗漏了什么,因为示例数组和排序后的数组似乎相同
  • 不,你没有遗漏任何东西,我只是给出了排序后的数组。
  • 排序的标准是什么?

标签: php arrays sorting


【解决方案1】:

您知道 PHP 有出色的文档吗?看看asort。如果需要进行不区分大小写的比较,可能需要uasort

【讨论】:

    【解决方案2】:

    我不确定你想要什么。
    但我猜是这样的:

    对数组进行排序

    1st : by the first 4 digits of the key
    2nd : by the last 2 digits if they're present
    
    
    $arr = array(
        '100102'  => 'DUMMY123',
        '100100'  => 'test1',
        '1000'    => 'DUMMY',
        '100004'  => 'DUMMY4',
        '100001'  => 'DUMMY1',
        '100002'  => 'DUMMY3',
        '1001'    => 'TEST',
    );
    
    function mysort($a, $b) {
        preg_match('/^(\d{4})(\d\d)?$/', $a, $ma);
        preg_match('/^(\d{4})(\d\d)?$/', $b, $mb);
    
        if ($ma[1] == $mb[1]) {
            if (!isset($ma[2])) $ma[2] = '';
            if (!isset($mb[2])) $mb[2] = '';
            return strcmp($ma[2], $mb[2]);
        }
        return strcmp($ma[1], $mb[1]);
    }
    uksort($arr, 'mysort');
    print_r($arr);
    

    输出:

    Array
    (
        [1000] => DUMMY
        [100001] => DUMMY1
        [100002] => DUMMY3
        [100004] => DUMMY4
        [1001] => TEST
        [100100] => test1
        [100102] => DUMMY123
    )
    

    【讨论】:

      【解决方案3】:

      asort() 无论您添加多少额外的 2 字符子类别,都应该可以解决问题。使用 SORT_STRING 标志,类别甚至不必是字符串。

      $arr =('100001'=>'DUMMY1',
             '1000'=>'DUMMY',
             '1001'=>'TEST',
             '100002'=>'DUMMY3',
             '100004'=>'DUMMY4',
             '100102'=>'DUMMY123',
             '100100'=>'test1');
      
      asort($arr, SORT_STRING);
      

      应该会导致

      $arr =('1000'=>'DUMMY',
             '100001'=>'DUMMY1',
             '100002'=>'DUMMY3',
             '100004'=>'DUMMY4',
             '1001'=>'TEST',
             '100100'=>'test1',
             '100102'=>'DUMMY123');
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-01
        • 2021-11-08
        相关资源
        最近更新 更多