-1

各ユーザーのスコアを保存しています。各スコアはランクにマッピングする必要があります。たとえば、スコア要件が 15 であるbloggerため、スコアが 17 の人はランク付けされます。blogger

$score = 17;

$rank = array(
    15 => array('profile_rank_name' => 'Blogger', 'profile_rank_image' => 'blogger.png'),
    18 => array('profile_rank_name' => 'News Editor', 'profile_rank_image' => 'news_editor.png'),
    23 => array('profile_rank_name' => 'Researcher', 'profile_rank_image' => 'researcher.png'),
    29 => array('profile_rank_name' => 'Publications Assistant', 'profile_rank_image' => 'publications_assistant.png'),
    36 => array('profile_rank_name' => 'Editorial Assistant', 'profile_rank_image' => 'editorial_assistant.png'),
    45 => array('profile_rank_name' => 'Copy Editor', 'profile_rank_image' => 'copy_editor.png'),
)

この場合、スコアは 17 であるため、$rank[15] が返されます。$score が 15 以上であるためです。これについてどうすればよいでしょうか?

編集:

Uksort は、ユーザー定義の比較関数を使用して配列をキーで並べ替えます。内部でどのように機能しているかはわかりません。以下の関数で、$a と $b は何ですか?

if( ! function_exists('cmp'))
{
    function cmp($a, $b)
    {
        return $a;
    }
}

uksort($rank, "cmp");

編集: 質問があいまいであることに気付きました。午前 3 時に申し訳ありませんが、通常のように明確に考えていません。返信ありがとうございます。質問を言い換えることを考えなければなりません。

受け入れられた回答

public function get_profile_rank($score)
{
    /* This method exists as an optimisation effort. Ranks are defined within the database table `author_profile_rank`.
     * When we don't need application functionality on ranks and we only need to display the rank name and image we
     * call this method. It saves using a table join to retrieve the rank name and image.
     * http://stackoverflow.com/questions/19886351/returning-an-array-key-based-on-a-integer/19886467?noredirect=1#comment29583797_19886467
     */

    if($score <= 17)
    {
        return array('profile_rank_name' => 'Blogger', 'profile_rank_image' => 'blogger.png');
    }
    elseif($score >= 45)
    {
        return array('profile_rank_name' => 'Copy Editor', 'profile_rank_image' => 'copy_editor.png');
    }

    $ranks = array(
        23 => array('profile_rank_name' => 'Researcher', 'profile_rank_image' => 'researcher.png'),
        29 => array('profile_rank_name' => 'Publications Assistant', 'profile_rank_image' => 'publications_assistant.png'),
        36 => array('profile_rank_name' => 'Editorial Assistant', 'profile_rank_image' => 'editorial_assistant.png'),
    );

    $lower = function($val) use ($score)
    {
        if($val <= $score) return TRUE;
    };

    return $ranks[max(array_filter(array_keys($ranks), $lower))];
}
4

6 に答える 6

2

配列をループし、値がスコア以下の場合は配列内の項目に変数を設定します。値が大きい場合にブレークします。

私は10年以上phpを書いていませんが、次のようなものです:

foreach($rank as $currentRank=>$rankData){
    if($currentRank <= $score) $matchedRank = $rankData;
    else break;
}
于 2013-11-10T04:53:44.010 に答える
1

1)ランクが昇順になるように配列をソートします(ソートされていない場合、次の場合は失敗します)

2)配列の内容ではなくキーをループする必要があるため、最初にキーを取得します

$keys = array_keys($ranks)

3) foreach または for the one of the two を使用して、配列をループします

foreach($keys as $key){
   if($score >= $key){
       echo $ranks[$key];
   }
}

注: ソートされていない場合、上記のコードを実行したときに間違った結果が得られます。ランクが 1000 程度ある場合、効果的な方法は、二分探索を使用して $ranks での $score の大まかな位置を取得することです。

于 2013-11-10T04:52:45.823 に答える
1

このようなことを試してください

<?php
    $score = 17;

$rank = array(
    15 => array('profile_rank_name' => 'Blogger', 'profile_rank_image' => 'blogger.png'),
    18 => array('profile_rank_name' => 'News Editor', 'profile_rank_image' => 'news_editor.png'),
    23 => array('profile_rank_name' => 'Researcher', 'profile_rank_image' => 'researcher.png'),
    29 => array('profile_rank_name' => 'Publications Assistant', 'profile_rank_image' => 'publications_assistant.png'),
    36 => array('profile_rank_name' => 'Editorial Assistant', 'profile_rank_image' => 'editorial_assistant.png'),
    45 => array('profile_rank_name' => 'Copy Editor', 'profile_rank_image' => 'copy_editor.png'),
);


foreach ($rank as $k=>$v)
{
    if($score<=$rank[$k])
    {
        print_r($v);//Prints the first array element.
        break; 
    }
}

出力:

Array ( [profile_rank_name] => Blogger [profile_rank_image] => blogger.png )
于 2013-11-10T04:53:00.263 に答える
1

答えになるかも?あなたの質問に基づいて:

$score = 17;

$ranks = array(
    15 => array('profile_rank_name' => 'Blogger', 'profile_rank_image' => 'blogger.png'),
    18 => array('profile_rank_name' => 'News Editor', 'profile_rank_image' => 'news_editor.png'),
    23 => array('profile_rank_name' => 'Researcher', 'profile_rank_image' => 'researcher.png'),
    29 => array('profile_rank_name' => 'Publications Assistant', 'profile_rank_image' => 'publications_assistant.png'),
    36 => array('profile_rank_name' => 'Editorial Assistant', 'profile_rank_image' => 'editorial_assistant.png'),
    45 => array('profile_rank_name' => 'Copy Editor', 'profile_rank_image' => 'copy_editor.png')
);

foreach($ranks as $rank)
{
    if($score >= $rank )
    {
        echo $rank['profile_rank_name']."-".$rank['profile_rank_image'];
    }
}
于 2013-11-10T04:44:34.910 に答える
0
$keys = array_keys($rank);
sort($keys); // not needed in your example, just to be *bug* free
$score = 17;
$index = array_reduce($keys, function ($prev, $next) use ($score) {
    return ($prev <= $score && $score < $next) ? $prev : $next;
}) ?: min($keys);
var_dump($index); // int(15)
print $rank[$index]['profile_rank_name']; // Blogger

$index$scoreが最小キーより小さい場合、最小配列キーになります。したがって、 と の両方で機能し$score < min($keys)ます$score > max($keys)。:)

実際のデモ: https://eval.in/65190

$scorein のデモrange(0, 100): https://eval.in/65196

PS: PHP 5.3+ (短い 3 項およびクロージャー コールバックを使用しています)

于 2013-11-10T05:00:04.933 に答える