1

我有一个如下的 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 开头)我非常感谢您的任何帮助。非常感谢你...

4

6 回答 6

7

您的比较逻辑将是这样的:

  • 如果两个字符串 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);
于 2011-08-07T11:49:12.933 回答
1
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' ) );
于 2011-08-07T12:15:43.777 回答
1
$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()returns false),则它假定一个“无限”索引(PHP_INT_MAX),

于 2011-08-07T12:20:57.190 回答
0

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

于 2011-08-07T11:35:50.207 回答
0

根据反映字母的比较,按值对数据进行排序(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());
于 2011-08-07T12:30:18.460 回答
-1

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

于 2011-08-07T11:35:37.663 回答