PHP сортировать массив с помощью конкретной буквы - PullRequest
0 голосов
/ 07 августа 2011

У меня есть массив 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) Я очень ценю вашу помощь. Большое спасибо ...

Ответы [ 6 ]

6 голосов
/ 07 августа 2011

Ваша логика сравнения будет выглядеть следующим образом:

  • , если две строки 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);
1 голос
/ 07 августа 2011
$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),

1 голос
/ 07 августа 2011
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' ) );
0 голосов
/ 07 августа 2011

Сортировка данных по значению на основе сравнения , отражающего букву ( 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());
0 голосов
/ 07 августа 2011

Это пример, который я нашел на php.net, который может помочь вам и поддерживать индекс: http://www.php.net/manual/en/function.sort.php#99419

0 голосов
/ 07 августа 2011

Используйте usort для сортировки по функции.Функция может содержать любую логику, которую вы хотите вставить, если возвращаемое значение указывает порядок сортировки (подробности см. По ссылке).

...