0

私は次のような単純な配列を持っています:

array (size=6)
  0 => 
    array (size=2)
      'id' => int 1
      'primary' => boolean false
  1 => 
    array (size=2)
      'id' => int 2
      'primary' => boolean false
  2 => 
    array (size=2)
      'id' => int 3
      'primary' => boolean false
  3 => 
    array (size=2)
      'id' => int 4
      'primary' => boolean true
  4 => 
    array (size=2)
      'id' => int 5
      'primary' => boolean false
  5 => 
    array (size=2)
      'id' => int 6
      'primary' => boolean false

配列が生成されるとき、それは常にid上記のようにによって順序付けられます。私がやりたいのは、最初の要素となる配列要素をプロモートすることですusort()。である要素は常に1つだけです。primaryTRUEprimaryTRUE

次に、以下で使用する簡単な比較関数を作成しましたusort()

$data = array(
            array('id' => 1, 'primary' => FALSE),
            array('id' => 2, 'primary' => FALSE),
            array('id' => 3, 'primary' => FALSE),
            array('id' => 4, 'primary' => TRUE),
            array('id' => 5, 'primary' => FALSE),
            array('id' => 6, 'primary' => FALSE),
        );

function sortArray($a, $b){

    if($a['primary']){
        return -1;
    }elseif($b['primary']){
        return 1;
    }else{
        return 0;
    }
}

var_dump($data);

usort($data, 'sortArray');

var_dump($data);

withの要素primary = TRUEが前面にプロモートされますが、残りの要素は逆の順序で並べ替えられ、withの要素は適切でid = 5はありません。

array (size=6)
  0 => 
    array (size=2)
      'id' => int 4
      'primary' => boolean true
  1 => 
    array (size=2)
      'id' => int 5
      'primary' => boolean false
  2 => 
    array (size=2)
      'id' => int 6
      'primary' => boolean false
  3 => 
    array (size=2)
      'id' => int 3
      'primary' => boolean false
  4 => 
    array (size=2)
      'id' => int 2
      'primary' => boolean false
  5 => 
    array (size=2)
      'id' => int 1
      'primary' => boolean false

両方の要素のprimaryプロパティがfalseの場合、IDを比較できることはわかっています。

function sortArray($a, $b){

    if($a['primary']){
        return -1;
    }elseif($b['primary']){
        return 1;
    }else{
        return $a['id'] > $b['id'];
    }
}

しかし、なぜusort他の要素の順序をランダム化するのですか?usort()要素をプロモートし、配列の残りの部分をそのままにしておくために使用することは可能ですか?

4

2 に答える 2

0

この比較関数を試してください:

function sortArray($a, $b)
{
    if($a['primary'])
    {
        $result = 1;
    }
    elseif($b['primary'])
    {
        $result = -1;
    }
    else
    {
        $result = ($a['id'] < $b['id']) ? -1 : 1;
    }

    return $result;
}

$result = ($a['id'] < $b['id']) ? -1 : 1;に変更する$result = ($a['id'] < $b['id']) ? 1 : -1;と、逆順で並べ替えることができます。

比較関数でreturn $a['id'] > $b['id']は、0 または 1 (true または false) が返されますが、-1 は返されません。ドキュメントから:

「比較関数は、最初の引数がそれぞれ 2 番目の引数より小さい、等しい、または大きいと見なされる場合、ゼロより小さい、等しい、または大きい整数を返さなければなりません。」

最速の比較ソートは O(N*log(N)) で、線形時間よりも遅くなります。このため、配列 (O(N)、線形時間) を反復処理し、「プライマリ」が設定された要素をtrue配列の先頭に移動することをお勧めします。

于 2012-07-03T01:42:09.070 に答える
0

usort()はキーのインデックスを再作成します。代わりにuasort()を使用してみてください。

于 2012-07-03T01:42:43.853 に答える