【问题标题】:Case Insensitively Sort a Multidimensional PHP Array using array_multisort()使用 array_multisort() 对多维 PHP 数组进行不区分大小写的排序
【发布时间】:2015-01-24 07:39:41
【问题描述】:

经过大量搜索,我无法找到关于如何使用 array_multisort() 以不区分大小写方式按一个字段对多维数组进行排序的良好解释。在处理来自数据库查询的信息时,我发现这是一个非常有用的功能,所以我想分享一下。

【问题讨论】:

    标签: php arrays sorting case-insensitive


    【解决方案1】:

    你也可以这样做:

    foreach ($PDOresult as $key => $row) {
        $sort_by[$key] = strtolower($row['name']);
    }
    
    array_multisort($sort_by, SORT_ASC, $PDOresult);
    

    不需要特殊标志,因为排序的所有内容都是小写的。如果您担心 UTF-8,请改用 mb_strtolower()。 这将与具有特殊标志的解决方案具有相同的结果,但在我看来更直观。

    【讨论】:

      【解决方案2】:

      我应该注意这仅适用于 php 5.4+

      # Example results from database
      $PDOresult = array(
          array('name' => 'Alpha', 'price' => '10'),
          array('name' => 'beta', 'price' => '12'),
          array('name' => 'Gamma', 'price' => '14'),
          array('name' => 'delta', 'price' => '16'),
          array('name' => 'Epsilon', 'price' => '18'),
          array('name' => 'zeta', 'price' => '20'),
          ...
      );
      
      # Create array of field to sort by - 'name' in this example
      foreach ($PDOresult as $key => $row) {
          $sort_by[$key] = $row['name'];
      }
      
      # Sort array - The flags SORT_NATURAL & SORT_FLAG_CASE are required to make the
      # sorting case insensitive.
      array_multisort($sort_by, SORT_ASC, SORT_NATURAL|SORT_FLAG_CASE, $PDOresult);
      
      # Output
      var_dump($PDOresult);
      

      如果使用 php 5.5+,您可以跳过 foreach() 并改用 array_column()。像这样:

      $sort_by = array_column($PDOresult, 'name');
      

      我很想把它编辑成写得很好的答案:How can I sort arrays and data in PHP?,但我不想搞砸格式,所以如果有人想这样做并关闭它,我会很好。

      【讨论】:

        【解决方案3】:

        @damndaewoo

        SORT_ASC|SORT_NATURAL|SORT_FLAG_CASE
        

        在某些情况下会给你:

        Warning: array_multisort(): Argument #2 is an unknown sort flag 
        

        正如文档所说 here 你应该使用 ',' 而不是 '|' 但是您不能执行以下操作:

        SORT_ASC,SORT_NATURAL,SORT_FLAG_CASE 因为你会得到一个意想不到的:

        Argument #4 is expected to be an array or sorting flag that has not already been specified
        

        相反,您将使用以下两种技术:

        array_multisort($sort_by, SORT_ASC,SORT_NATURAL|SORT_FLAG_CASE, $PDOresult);

        【讨论】:

        • 我之前没有发出过这个警告,而且我已经使用这个方法有一段时间了。我猜这取决于你的配置
        猜你喜欢
        • 1970-01-01
        • 2013-08-21
        • 1970-01-01
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 2019-10-05
        • 2011-01-30
        相关资源
        最近更新 更多