1

私は配列を持っています:

$a = array("Freshman Spring" => 3, "Freshman Winter" => 2, "Freshman Summer" => 4, "Freshman Fall" => 1); 

学年ごとに異なる配列がありますが、fre、sophなどの年を混合する配列はありません。

私の問題は、学校で季節が発生する方法(秋、冬、春、夏)でこの配列を並べ替える必要があることです。uksortを使用してみましたが、同じ方法でソートされるため、実際には何も実行されません。

function cmp($a, $b) {
    $a = preg_replace('@^(freshman|sophomore|junior|senior) @', '', $a);
    $b = preg_replace('@^(freshman|sophomore|junior|senior) @', '', $b);
    return strcasecmp($a, $b);
}

uksort($a, "cmp");

私はこれを手に入れます:

Array
(
    [Freshman Fall] => 1
    [Freshman Spring] => 3
    [Freshman Summer] => 4
    [Freshman Winter] => 2
)

しかし、これを取得する必要があります:

Array
(
    [Freshman Fall] => 1
    [Freshman Winter] => 2
    [Freshman Spring] => 3
    [Freshman Summer] => 4
)

uksortは行く方法ですか?そして、私は何が間違っているのですか?配列の値はそれらの値ではなく、オブジェクトを保持することに注意してください。ありとあらゆる助けに大いに感謝します!

4

4 に答える 4

1

あなたは本当に近いです。実際、uksortは、あなたが求めていることを正確に実行し、グレード指定を取り除き、2番目の単語でアルファベット順に並べ替えています。あなたがそれをする必要があることは少し異なります-あなたはそれを季節によって分類するように頼んでいます。表示したいソート順に基づいて、それらの独自の比較を作成する必要があります。mr-skによって提供されたソリューションを使用するか、次のようなことを行うことができます。

function cmp($a, $b) {
    $a = preg_replace('@^(freshman|sophomore|junior|senior) @', '', $a);
    $b = preg_replace('@^(freshman|sophomore|junior|senior) @', '', $b);
    $seasons = array("FALL"=>0, "WINTER"=>1, "SPRING"=>2, "SUMMER"=>3);
    return $seasons[strtoupper($a)]-$seasons[strtoupper($b)];
}

また、正規表現を次のように変更することもできます(最初にこれらの単語しか取得できないことが確実な場合)

/^\w* /

楽しみ!

于 2012-08-13T21:19:48.963 に答える
1

値をキー{1,2,3,4}として使用し、「オブジェクト」を値として格納してみませんか。並べ替えがとても簡単になります...

きれいな名前が必要な場合は、いつでも{1,2,3,4}を定義またはクラス定数にマップできます。

于 2012-08-13T21:09:35.787 に答える
1

季節だけで strcasecmp() を実行しているため、コードは失敗します。つまり、季節をアルファベット順に並べているため、結果が表示されます。定義された順序で並べ替える必要があります。

季節を事前に割り当てられた数値に変換して、このようにします。

function cmp($a, $b) {
    $seasons = array('Fall'=>1, 'Winter'=>2, 'Spring'=>3, 'Summer'=>4);
    $aParts = explode(' ', $a);
    $bParts = explode(' ', $b);

    $a = $seasons[$aParts[1]];
    $b = $seasons[$bParts[1]]

    return $b - $a;
}

クラスを含めたい場合:

function cmp($a, $b) {
    $classes = array('Freshman'=>1, 'Sophomore'=>2, 'Junior'=>3, 'Senior'=>4);
    $seasons = array('Fall'=>1, 'Winter'=>2, 'Spring'=>3, 'Summer'=>4);
    list($aClass, $aSeason) = explode(' ', $a);
    list($bClass, $bSeason) = explode(' ', $b);
    $aNum = 10*$classes[$aClass] + $seasons[$aSeason];
    $bNum = 10*$classes[$bClass] + $seasons[$bSeason];

    return $bNum - $aNum;           
}
于 2012-08-13T21:23:46.980 に答える
-1

値ではなくキーでソートしています。キーで並べ替えると、秋<春<夏<冬になります。

使うだけ

asort($a);

これにより、値 (1,2,3,4) で並べ替えられますが、重要な相関関係は維持されます。

于 2012-08-13T21:19:00.350 に答える