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

比較ロジックは次のようになります。

  • 2 つの文字列 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);

2 つの文字列内の文字の位置を比較するだけです。文字が文字列のいずれにも含まれていない場合 ( return )、「無限」のインデックス ( ) と見なされstrpos()ます。falsePHP_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 に答える