0

PHP配列に関連する一見単純なランキングタイプの問題がありますが、残念ながら多くの調査の結果、私を打ち負かしました:

キーが人の名前で、値が関連付けられた数字である単純な配列があります。

$myArray = Array("David"=>36, "James"=>24, "Sarah"=>70, "Mary"=>55);

ここに課題があります。名前が与えられた場合、配列内でのランクは何ですか? 例: サラ=ランク1; 配列を値で並べ替えてから、必要な名前にループしてランクを取得できると考えたので、単純に思えます。ただし、奇妙なことに、配列をソートすると、役に立たないことに 1 が返されます。

print_r(asort($myArray)) = 1 (??)

配列をMySQLテーブルに入れることができると思いますが、それは少し面倒です。PHPソリューションを知っている人はいますか? ソートのどこが間違っていますか?ドキュメントhereを読みましたが、 asort が適切な機能であるようです(関連付けを保持し、値を並べ替えます)。


グリンチありがとう

4

3 に答える 3

1

asort関数はブール値を返し、指定された配列を参照としてソートします

var_dump(asort($myArray)) = bool(true)

このprint_r($myArray)前の行の後に、ソートされた配列を取得します$myArray

編集:再読。

これを実行して、ランキングを多数取得してください。

<?php
    /* asort = Lower num to Upper */
    asort($myArray);
    /* arsort = Upper one to lower */
    // arsort($myArray);
    $ranks = array_fill(1,count($myArray),'foo');
    $ranked = array_combine(array_flip($myArray),array_keys($ranks));
    /* Output */
    print_r($ranked);
    /* Array ( [James] => 1 [David] => 2 [Mary] => 3 [Sarah] => 4 )  */
?>
于 2012-08-20T09:04:01.040 に答える
1

(編集済み - 現在動作しています)

ちょっと醜いですが、これはうまくいくはずです:

arsort($origArr);
$rankedArr = array_keys($origArr);
foreach ($rankedArr as $rank => $person) {
    if ($person == 'Sarah') {
        echo $rank + 1;
        break;
    }
}

あなたがしていることは、最初に値でソートし、次にそれらの値を削除して、インデックス付きの人のリストを取得することです。キー値 + 1がランクです。(最初は0だからですよね?)

EDIT2 - 少しきれい:

arsort($origArr);
$rankedArr = array_keys($origArr);
$finalRanks = array_flip($rankedArr);
$rank = $finalRanks['Sarah'] + 1;

:-)

于 2012-08-20T09:22:26.933 に答える
0

asorthere で説明されているように、bool 値を返します。

于 2012-08-20T09:05:04.053 に答える