【问题标题】:PHP sort array using specific letterPHP使用特定字母对数组进行排序
【发布时间】:2011-10-21 19:09:28
【问题描述】:

我有一个如下的 php 数组:

Array ( 
[0] => Array ( [value] => 5 [label] => Akon )
[1] => Array ( [value] => 6 [label] => Angel ) 
[2] => Array ( [value] => 7 [label] => Britny ) 
[3] => Array ( [value] => 9 [label] => Mark Anthony ) 
[4] => Array ( [value] => 8 [label] => Michel ) 
[5] => Array ( [value] => 4 [label] => Shaggy ) 
[6] => Array ( [value] => 3 [label] => Smith ) 
) 

我需要这个数组按特定字母排序。例如,如果我按这个“M”排序,字母数组应该如下所示。

Array ( 
[3] => Array ( [value] => 9 [label] => Mark Anthony ) 
[4] => Array ( [value] => 8 [label] => Michel ) 
[6] => Array ( [value] => 3 [label] => Smith ) 
[0] => Array ( [value] => 5 [label] => Akon ) 
[1] => Array ( [value] => 6 [label] => Angel ) 
[2] => Array ( [value] => 7 [label] => Britny ) 
[5] => Array ( [value] => 4 [label] => Shaggy ) 
) 

乞求字母应该出现在数组的第一个。(这里以m开头) 我非常感谢您的任何帮助。非常感谢...

【问题讨论】:

    标签: php arrays sorting sql-order-by letter


    【解决方案1】:

    你的比较逻辑是这样的:

    • 如果两个字符串 A 和 B 以相同的字母开头,照常进行比较
    • 如果 A 以“M”开头,则 A 获胜
    • 如果 B 以“M”开头,则 B 获胜
    • 否则,照常比较

    在代码中

    $strings = array('Foo', 'Moo', 'Xuux', 'Me', 'Blah', 'Ma');
    $letter = 'M';
    
    usort($strings, function($a, $b) use($letter) {
        if($a[0] != $b[0]) {
            if($a[0] == $letter) return -1;
            if($b[0] == $letter) return +1;
        }
        return strcmp($a, $b);  
    });
    
    print_r($strings);
    

    【讨论】:

      【解决方案2】:
      class Cmp {
          public $letter;
      
          function __construct( $letter ) { $this->letter = $letter; }
      
          function doCmp( $a, $b ) {
              if( $a['label'][0] == $this->letter ) {
                  if( $b['label'][0] != $this->letter ) return -1;
              } else {
                  if( $b['label'][0] == $this->letter ) return 1;
              }
              return $a['label'] > $b['label'] ? 1 : -1;
          }
      }
      
      usort( $arr, array( new Cmp( 'M' ),  'doCmp' ) );
      

      【讨论】:

        【解决方案3】:
        $strings = array ( 
            array ( 'value' => 5, 'label' => 'Akon' ),
            array ( 'value' => 6, 'label' => 'Angel' ), 
            array ( 'value' => 7, 'label' => 'Britny' ), 
            array ( 'value' => 9, 'label' => 'Mark Anthony' ) ,
            array ( 'value' => 8, 'label' => 'Michel' ) ,
            array ( 'value' => 4, 'label' => 'Shaggy' ) ,
            array ( 'value' => 3, 'label' => 'Smith' ) 
        ) ;
        
        var_dump($strings);
        
        
        $letter = 'm';
        usort ($strings, function ($left, $right) {
            return ((($posLeft = strpos(strtolower($left['label']), 'm')) === false)
                               ? PHP_INT_MAX
                               : $posLeft)
                 - ((($posRight = strpos(strtolower($right['label']), 'm')) === false) 
                               ? PHP_INT_MAX 
                               : $posRight);
        });
        var_dump($strings);
        

        只是比较两个字符串中字母的位置。如果该字母不在其中一个字符串中(strpos() 返回false),则假定为“无限”索引(PHP_INT_MAX),

        【讨论】:

          【解决方案4】:

          这是我在 php.net 上找到的一个示例,它可以帮助您并维护索引:http://www.php.net/manual/en/function.sort.php#99419

          【讨论】:

            【解决方案5】:

            根据反映字母比较,按数据进行排序(Demo):

            <?php
            
            # the data
            $data = array(
              0 => array(
                'value' => 5,
                'label' => 'Akon',
              ),
              1 => array(
                'value' => 6,
                'label' => 'Angel',
              ),
              2 => array(
                'value' => 7,
                'label' => 'Britny',
              ),
              3 => array(
                'value' => 9,
                'label' => 'Mark Anthony',
              ),
              4 => array(
                'value' => 8,
                'label' => 'Michel',
              ),
              5 => array(
                'value' => 4,
                'label' => 'Shaggy',
              ),
              6 => array(
                'value' => 3,
                'label' => 'Smith',
              ),
            );
            
            # the letter
            $letter = 'M';
            
            # the value to compare against
            $value = function(array $a)
            {
              $key = 'label';
              if (!array_key_exists($key, $a))
              {
                 throw new InvalidArgumentException(sprintf('Key "%s" missing.', $key));
              }
              return $a[$key];
            };
            
            # the comparison
            $compare = function($a, $b) use ($letter, $value) 
            {
              $a = $value($a);
              $b = $value($b);
              if($a[0] != $b[0]) {
                if($a[0] === $letter) return -1;
                if($b[0] === $letter) return +1;
              }
              return strcmp($a, $b);  
            };
            
            # the sort
            $sort = function() use ($data, $compare)
            {
              $r = uasort($data, $compare);
              if (!$r)
              {
                throw new RuntimeException('Sort failed.');
              }
              return $data;
            };
            
            print_r($sort());
            

            【讨论】:

              【解决方案6】:

              使用usort 按函数排序。该函数可以包含你想放入的任何逻辑,只要返回值指示排序顺序(详见链接)。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2010-12-12
                • 2013-06-11
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2023-03-15
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多