【问题标题】:Sort Array by Name PHP按名称排序数组 PHP
【发布时间】:2018-05-02 08:31:55
【问题描述】:

我有这个关联数组,我想按自定义顺序排序(不只是按字母顺序)

$arr = [
    '1' => 'Lorem Ipsum 1',
    '2' => 'Lorem Ipsum 3',
    '3' => 'Lorem Ipsum 2',
    '4' => 'Text A',
    '5' => 'Text B',
    '6' => 'Text C',
    '7' => 'Lorem Ipsum 4',
    '8' => 'Text D',
    '9' => 'Text E',
];

我需要这个输出:

$arr = [
    '4' => 'Text A',
    '5' => 'Text B',
    '6' => 'Text C',
    '8' => 'Text D',
    '9' => 'Text E',
    '1' => 'Lorem Ipsum 1',
    '3' => 'Lorem Ipsum 2',
    '2' => 'Lorem Ipsum 3',
    '7' => 'Lorem Ipsum 4'
];

数组需要如何排序(保持键值关联)

  • 按字母顺序排列数组
  • 此后,所有以 Text 开头的值都必须在顶部

我已经尝试过使用 uasort 函数,但不知道如何从 Text 开始对它们进行排序。

谢谢

【问题讨论】:

    标签: php arrays sorting


    【解决方案1】:

    您可以使用uasort(),并在排序函数中检查值是否以"Text" 开头。如果是,则使用这种情况排序,否则,自然排序:

    $arr = [
        '1' => 'Lorem Ipsum 1',
        '2' => 'Lorem Ipsum 3',
        '3' => 'Lorem Ipsum 2',
        '4' => 'Text A',
        '5' => 'Text B',
        '6' => 'Text C',
        '7' => 'Lorem Ipsum 4',
        '8' => 'Text D',
        '9' => 'Text E',
    ];
    uasort($arr, function($a, $b){
        $a_text = strpos($a, 'Text') === 0;
        $b_text = strpos($b, 'Text') === 0;
        if ($a_text != $b_text) {
            return $b_text - $a_text ;
        }
        return strnatcmp($a,$b);
    });
    print_r($arr);
    

    输出:

    Array
    (
        [4] => Text A
        [5] => Text B
        [6] => Text C
        [8] => Text D
        [9] => Text E
        [1] => Lorem Ipsum 1
        [3] => Lorem Ipsum 2
        [2] => Lorem Ipsum 3
        [7] => Lorem Ipsum 4
    )
    

    【讨论】:

      【解决方案2】:

      使用asorthttp://php.net/manual/en/function.asort.php.

       asort($arr);
      

      asort() - 保持键关联:是的。

      【讨论】:

      • 您的代码输出将创建一个从 Lorem Ipsum 1 开始并在 Text E 结束的数组
      • 我怎样才能将所有以 Text 开头的值放在顶部?仅按字母顺序排序并不能保证这一点。
      【解决方案3】:
      $arr = [
              '1' => 'Lorem Ipsum 1',
              '2' => 'Lorem Ipsum 3',
              '3' => 'Lorem Ipsum 2',
              '4' => 'Text A',
              '5' => 'Text B',
              '6' => 'Text C',
              '7' => 'Lorem Ipsum 4',
              '8' => 'Text D',
              '9' => 'Text E',
          ];
      
          rsort($arr);
          var_dump($arr);
      

      【讨论】:

      • 我怎样才能将所有以 Text 开头的值放在顶部?仅按字母顺序排序并不能保证这一点。
      猜你喜欢
      • 2020-11-04
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 2012-09-07
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      相关资源
      最近更新 更多