3

配列内で2番目に高い変数を見つけたいと思います。

たとえば、私が持っている場合:

$cookies = array(
                "chocolate" => "20",
                "vanilla" => "14",
                "strawberry" => "18",
                "raspberry" => "19",
                "bluebery" => "29"
);

を使用max($cookies)して、最高の変数であるを見つけることができます"bluebery" => "29"

しかし、どうすれば2番目に高いものを見つけることができますか? "chocolate" => "20"

4

9 に答える 9

15

並べ替えて2番目のアイテムを取得するのが最も簡単な方法です。

arsort($cookies);
$keys = array_keys($cookies);

echo $keys[1]; // chocolate
echo $cookies[$keys[1]]; // 20

より効率的な方法が必要な場合は、最高のアイテムと2番目に高いアイテムの両方を同時に追跡することにより、手動で行うこともできます。

function secondMax($arr) {
    $max = $second = 0;
    $maxKey = $secondKey = null;

    foreach($arr as $key => $value) {
        if($value > $max) {
            $second = $max;
            $secondKey = $maxKey;
            $max = $value;
            $maxKey = $key;
        } elseif($value > $second) {
            $second = $value;
            $secondKey = $key;
        }
    }

    return array($secondKey, $second);
}

使用法:

$second = secondMax($cookies);
echo "{$second[0]} => {$second[1]}"; // chocolate => 20
于 2012-06-05T13:05:18.477 に答える
5

楽しみのためにあなたはmax()2回使うことができます:)

例えば:

  • アレイを複製します
  • 走るmax()
  • 最大を削除します
  • max()もう一度実行します

別の方法は、値に基づいて配列をソートし、配列の2番目の要素を取得することです。どちらが速いのか気になります。おそらくソート。

于 2012-06-05T13:05:06.557 に答える
2
arsort($cookies) AND array_shift($cookies) AND list($k, $v) = each($cookies);
echo "$k => $v"; // chocolate => 20
于 2012-06-05T13:09:14.940 に答える
1

試す :

asort($cookies);
end($cookies);
prev($cookies);
list($key,$value) = each($cookies);

またはそれを逆にします

arsort($cookies);
reset($cookies);
next($cookies);
list($key,$value) = each($cookies);

**編集**

誰かがこれに遭遇してそれを必要とするなら、とにかくこれを共有すると思いました:

/**
 * Returns the key => value pair with the specific rank.
 * if $rank is 0, falase is returned. If $rank is positive,
 * then the $rank th smallest pair is returned. If $rank
 * is negative, then the $rank th biggest pair is returned.
 * If $rank range is outside the size of the array, false
 * is returned. If a callable function is provided, it will
 * be used to sort the data. If $keySort is true, then the
 * data will be sorted by keys instead (the callback functions
 * will receive the keys to compare instead of values)
 * 
 * @param $data array
 * @param $rank int
 * @param $cmd_function callable (optional)
 * @param $keySort boolean (optional)
 * @return array            the key => value pair or false
 */
function findByRank($data, $rank, $cmd_function = null, $keySort = false) {
    if (($rank == 0) || (abs($rank) > count($data))) {
        return false;
    }
    $sort = ($keySort?'k':'a').'sort';
    if ($cmd_function != null) {
        $sort = 'u'.$sort;
        $sort($data, $cmd_function);
    } else {
        $sort($data);
    }

    if ($rank > 0) {
        reset($data);
        $next = 'next';
    } else {
        end($data);
        $next = 'prev';
        $rank = abs($rank);
    }
    while (--$rank > 0) $next($data);
    return each($data);
}




$cookies = array(
                "chocolate" => "20",
                "vanilla" => "14",
                "strawberry" => "18",
                "raspberry" => "19",
                "bluebery" => "29"
);

header('Content-type:text/plain; charset=utf-8');
var_dump(findByRank($cookies, -10));  // -> false
var_dump(findByRank($cookies, -2));   // -> 'chocolate' key=>value pair
var_dump(findByRank($cookies, -1));   // -> 'blueberry' key=>value pair
var_dump(findByRank($cookies, 0));    // -> false
var_dump(findByRank($cookies, 1));    // -> 'vanilla' key=>value pair
var_dump(findByRank($cookies, 3));    // -> 'raspberry' key=>value pair
于 2012-06-05T13:05:44.980 に答える
1
rsort($cookies);
echo $cookies[1];
于 2012-06-05T13:08:30.860 に答える
0

配列を降順にソートし、2番目の値を取ります。または、保存するには、最初の値を取得し、小さい値が見つかるまで配列を調べます。

于 2012-06-05T13:05:21.517 に答える
0

このURLを確認してください

http://maheshbokkisam.blogspot.in/2013/04/find-nth-highest-value-in-array-without.html

PHPでソートを使用せずに、指定された配列からN番目/N番目に高い値を検索します

$ar  =  array(23,56,87,12,98,85,24,54,99,100,1,4,5,2,76,37,92);

$n   = count($ar) - 5;

for($i = 0; $i < $n; $i++){
    // Get the max value from array // get the Nth value from last loop
    echo $a = max($ar); 

    echo "<br /><pre>"; print_r($ar);

    $ar = array_flip($ar);    // Flip the array
    //print_r($ar);

    unset($ar[$a]);           // Unset the max value from array
    //print_r($ar);

    $ar = array_flip($ar);    // Flip the array
    echo "</pre>";
    echo "<hr />";
}

于 2013-04-12T07:51:19.183 に答える
0
function second_largest($arr)
{
    sort($arr, SORT_NUMERIC);

    return($arr[count($arr) - 2]);
}

//echo 3

echo second_largest(array(0, 3, 4, 1, 2));
于 2014-06-20T11:50:52.647 に答える
0
<?php

 // Finding Second highest number (In case of index of array is random)
$arr = [-5 => 33, -4 => -2, 8 => 0, 44, 44, 44, 44, 44];
$max = -INF;
$secondMax = -INF;
$size = sizeof($arr);
if ($size > 1) {
    foreach ($arr as $key => $value) {
        echo "KEY-> ", $key, "VALUE->", $value, "\n";
        if ($value > $max) {
            $max = $value;
        } else {
            if ($value < $max && $value > $secondMax) {
                $secondMax = $value;
            }
        }
    }
} else if ($size == 0) {
    $max = "No Max element";
    $secondMax = "No Second highest element";
} else {
    foreach ($arr as $key => $value) {
        $max = $arr[$key];
        $secondMax = "No second highest element";
    }
}

echo "maxvalue = ", $max, "\n";
echo "secondmax =", $secondMax;
于 2017-07-31T16:16:31.207 に答える