我已经有了解决方案。但我认为它会更加优化。所以请为我提供一个解决方案。请记住,不要使用PHP的预定义功能。像max()函数一样。 我知道有很多方法可以找到它,但我想要最好和更好的解决方案。因为我的数组包含超过10万条记录,并且需要花费大量时间。或者某个时候网站会关闭。
我的代码:
<?php
$array = array('1', '15', '2','10',4);
echo "<pre>";
print_r($array);
echo "<pre>";
$max = 0;
$s_max=0;
for($i=0; $i<count($array); $i++)
{
$a = $array[$i];
$tmax = $max;
$ts_max = $s_max;
if($a > $tmax && $a > $ts_max)
{
$max = $a;
if($tmax > $ts_max) {
$s_max = $tmax;
} else {
$s_max = $ts_max;
}
} else if($tmax > $a && $tmax > $ts_max)
{
$max = $tmax;
if($a > $ts_max) {
$s_max = $a;
} else {
$s_max = $ts_max;
}
} else if($ts_max > $a && $ts_max > $tmax)
{
$max = $ts_max;
if($a > $tmax)
{
$s_max = $a;
} else {
$s_max = $tmax;
}
}
}
echo "Max=".$max;
echo "<br />";
echo "S_max=".$s_max;
echo "<br />";
?>
答案 0 :(得分:7)
<?php
$array = array('200', '15','69','122','50','201');
$max_1 = $max_2 = 0;
for($i=0; $i<count($array); $i++)
{
if($array[$i] > $max_1)
{
$max_2 = $max_1;
$max_1 = $array[$i];
}
else if($array[$i] > $max_2)
{
$max_2 = $array[$i];
}
}
echo "Max=".$max_1;
echo "<br />";
echo "Smax 2=".$max_2;
答案 1 :(得分:2)
请参阅此解决方案。
<?php
$numbers = array_unique(array(1,15,2,10,4));
// rsort : sorts an array in reverse order (highest to lowest).
rsort($numbers);
echo 'Highest is -'.$numbers[0].', Second highest is -'.$numbers[1];
// O/P: Highest is -15, Second highest is -10
?>
答案 2 :(得分:1)
我没有检查你的解决方案,但就复杂性而言,这是IMO的最佳选择。如果数组没有更多结构信息(如它的排序),则无法跳过条目。即最好的解决方案是在你的解决方案中的O(n)。
答案 3 :(得分:0)
“ Kanishka Panamaldeniya”给出的答案适合最高值,但在第二最高值时将失败,即,如果数组具有两个相似的最高值,则它将显示最高值和第二最高值。我通过添加一个级别比较来进行排序,效果很好。
$array = array(50,250,30,250,40,70,10,50); // 250 2-times
$max=$max2=0;
for ($i = 0; $i < count($array); $i++) {
if ($array[$i] > $max) {
$max2 = $max;
$max = $array[$i];
} else if (($array[$i] > $max2) && ($array[$i] != $max)) {
$max2 = $array[$i];
}
}
echo "Highest Value is : " . $max . "<br/>"; //output : 250
echo "Second highest value is : " . $max2 . "<br/>"; //output : 70
答案 4 :(得分:0)
此代码将从数组返回第二个最大值
$array = array(80,250,30,250,40,90,10,50,60,50); // 250 2-times
$max=$max2=0;
for ($i = 0; $i < count($array); $i++) {
if($i == 0) {
$max2 = $array[$i];
}
if($array[$i] > $max) {
$max = $array[$i];
}
if($max > $array[$i] && $array[$i] > $max2) {
$max2 = $array[$i];
}
}
echo "Highest Value is : " . $max . "<br/>"; //output : 250
echo "Second highest value is : " . $max2 . "<br/>"; //output : 90
答案 5 :(得分:0)
$array = array(80,250,30,40,90,10,50,60,50); // 250 2-times
$max=$max2=0;
foreach ($array as $key =>$val) {
if($max < $val) {
$max2 =$max;
$max = $val;
}
elseif(($max2 < $val) && ($max!=$val) {
$max2 = $val;
}
}
echo "Highest Value is : " . $max . "<br/>"; //output: 250
echo "Second highest value is : " . $max2 . "<br/>"; //output: 90
答案 6 :(得分:0)
这是一个完美,最短的代码,可以从数组中找出第二大的值。如果数组仅包含一个值,下面的代码将始终返回值。
Example 1.
$arr = [5, 8, 1, 9, 24, 14, 36, 25, 78, 15, 37];
asort($arr);
$secondLargestVal = $arr[count($arr)-1];
//this will return 37
Example 2.
$arr = [5];
asort($arr);
$secondLargestVal = $arr[count($arr)-1];
//this will return 5
答案 7 :(得分:0)
你也可以使用冒泡排序之类的排序技术
function bubble_Sort($my_array )
{
do
{
$swapped = false;
for( $i = 0, $c = count( $my_array ) - 1; $i < $c; $i++ )
{
if( $my_array[$i] > $my_array[$i + 1] )
{
list( $my_array[$i + 1], $my_array[$i] ) =
array( $my_array[$i], $my_array[$i + 1] );
$swapped = true;
}
}
}
while( $swapped );
return $my_array;
}
$test_array = array(3, 0, 2, 5, -1, 4, 1);
echo "Original Array :\n";
echo implode(', ',$test_array );
echo "\nSorted Array\n:";
echo implode(', ',bubble_Sort($test_array)). PHP_EOL;
Original Array :
3, 0, 2, 5, -1, 4, 1
Sorted Array :
-1, 0, 1, 2, 3, 4, 5