PHP排序数组的丢弃元素

时间:2016-01-13 16:42:47

标签: php arrays

我正在使用这种方式来安排$ arr中的数据我是如何需要它的。

它的效果非常好,但是当它超过16时它似乎失去了最后一个数组。

我认为问题出在数据上,但我还没有找到问题的根源。

当我使用这个数组时:

array ( 
0 => array ( 'race_order' => 1, 'heat_nbr' => 4, 'racer_id' => 620, 'heat_finish' => 4, 'race_time' => '120.00', ), 
1 => array ( 'race_order' => 1, 'heat_nbr' => 4, 'racer_id' => 645, 'heat_finish' => 5, 'race_time' => '120.00', ), 
2 => array ( 'race_order' => 1, 'heat_nbr' => 4, 'racer_id'=> 487, 'heat_finish' => 6, 'race_time' => '120.00', ), 
3 => array ( 'race_order' => 2, 'heat_nbr' => 3, 'racer_id' => 857, 'heat_finish' => 4, 'race_time' => '160.00', ), 
4 => array ( 'race_order' => 2, 'heat_nbr' => 3, 'racer_id'=> 1191, 'heat_finish' => 5, 'race_time' => '160.00', ), 
5 => array ( 'race_order' => 2, 'heat_nbr' => 3, 'racer_id' => 1269, 'heat_finish' => 6, 'race_time' =>'160.00', ), 
6 => array ( 'race_order' => 2, 'heat_nbr' => 3, 'racer_id'=> 723, 'heat_finish' => 7, 'race_time' => '160.00', ), 
7 => array ( 'race_order' => 3, 'heat_nbr' => 2, 'racer_id' => 245, 'heat_finish' => 3, 'race_time' =>'180.0000', ), 
8 => array ( 'race_order' => 3, 'heat_nbr' => 2, 'racer_id'=> 65, 'heat_finish' => 4, 'race_time' => '180.0000', ), 
9 => array ( 'race_order' => 3, 'heat_nbr' => 2, 'racer_id' => 269, 'heat_finish' => 5, 'race_time' =>'180.0000', ), 
10 => array ( 'race_order' => 3, 'heat_nbr' => 2,'racer_id' => 860, 'heat_finish' => 6, 'race_time' => '180.0000', ), 
11 => array ('race_order' => 3, 'heat_nbr' => 2, 'racer_id' => 226, 'heat_finish' => 7,'race_time' => '180.0000', ), 
12 => array ( 'race_order' => 4, 'heat_nbr'=> 1, 'racer_id' => 24, 'heat_finish' => 3, 'race_time' => '240.00', ),
13 => array ('race_order' => 4, 'heat_nbr' => 1, 'racer_id' => 1006, 'heat_finish' =>4, 'race_time' => '240.00', ), 
14 => array ( 'race_order' => 4, 'heat_nbr'=> 1, 'racer_id' => 625, 'heat_finish' => 5, 'race_time' => '240.00', ), 
15 => array ('race_order' => 4, 'heat_nbr' => 1, 'racer_id' => 1115, 'heat_finish' =>6, 'race_time' => '240.00', ), 
16 => array ( 'race_order' => 4, 'heat_nbr'=> 1, 'racer_id' => 1208, 'heat_finish' => 7, 'race_time' => '240.00', ), 
);

它按预期工作。随着下面代码中包含的数组,我输了:

16 => array ( 'race_order' => 4, 'heat_nbr'=> 1, 'racer_id' => 1208, 'heat_finish' => 7, 'race_time' => '240.00', ), 

我看不出有充分的理由。

//the insertion sort    
function sortArr(&$arr){    

    for($i = 0; $i<count($arr); $i++){      //loop that iterates through the array indexes    
    //set the current index as the current minimum    
        $index = $i;    
        $posOfMin = $arr[$i];    

        for($k = $i+1; $k < count($arr); $k++){     //loop that iterates from the current index to the array end to find the smallest heat_finish value    
            if($arr[$k]['heat_finish'] < $arr[$index]['heat_finish']){      //if a value smaller than the current assumed minimum is found, that value will be set as the current minimum    
                $index = $k;    
                $posOfMin = $arr[$k];    
            }    
        }    
    //swaps the position of the current index and the current minimum    
        $arr[$index] = $arr[$i];    
        $arr[$i] = $posOfMin;    
}    
}    

$arr = array (    
0 => array ( 'nbr_of_semis' => 2, 'race_order' => 1, 'heat_nbr' => 3, 'racer_id' => 1191, 'heat_finish' => 4, 'race_time' => '121.0000', ),    
1 => array ( 'nbr_of_semis' => 2, 'race_order' => 1, 'heat_nbr' => 3, 'racer_id' => 502, 'heat_finish' => 5, 'race_time' => '121.0000', ),    
2 => array ( 'nbr_of_semis' => 2, 'race_order' => 1, 'heat_nbr' => 3, 'racer_id' => 1269, 'heat_finish' => 6, 'race_time' => '121.0000', ),    
3 => array ( 'nbr_of_semis' => 2, 'race_order' => 1, 'heat_nbr' => 3, 'racer_id' => 723, 'heat_finish' => 7, 'race_time' => '121.0000', ),    
4 => array ( 'nbr_of_semis' => 2, 'race_order' => 2, 'heat_nbr' => 1, 'racer_id' => 24, 'heat_finish' => 4, 'race_time' => '130.0000', ),    
5 => array ( 'nbr_of_semis' => 2, 'race_order' => 2, 'heat_nbr' => 1, 'racer_id' => 1006, 'heat_finish' => 5, 'race_time' => '130.0000', ),    
6 => array ( 'nbr_of_semis' => 2, 'race_order' => 2, 'heat_nbr' => 1, 'racer_id' => 625, 'heat_finish' => 6, 'race_time' => '130.0000', ),    
7 => array ( 'nbr_of_semis' => 2, 'race_order' => 2, 'heat_nbr' => 1, 'racer_id' => 1115, 'heat_finish' => 7, 'race_time' => '130.0000', ),    
8 => array ( 'nbr_of_semis' => 2, 'race_order' => 3, 'heat_nbr' => 4, 'racer_id' => 121, 'heat_finish' => 3, 'race_time' => '136.0000', ),    
9 => array ( 'nbr_of_semis' => 2, 'race_order' => 3, 'heat_nbr' => 4, 'racer_id' => 620, 'heat_finish' => 4, 'race_time' => '136.0000', ),    
10 => array ( 'nbr_of_semis' => 2, 'race_order' => 3, 'heat_nbr' => 4, 'racer_id' => 487, 'heat_finish' => 5, 'race_time' => '136.0000', ),    
11 => array ( 'nbr_of_semis' => 2, 'race_order' => 3, 'heat_nbr' => 4, 'racer_id' => 645, 'heat_finish' => 6, 'race_time' => '136.0000', ),    
12 => array ( 'nbr_of_semis' => 2, 'race_order' => 4, 'heat_nbr' => 2, 'racer_id' => 379, 'heat_finish' => 3, 'race_time' => '152.0000', ),    
13 => array ( 'nbr_of_semis' => 2, 'race_order' => 4, 'heat_nbr' => 2, 'racer_id' => 17, 'heat_finish' => 4, 'race_time' => '152.0000', ),    
14 => array ( 'nbr_of_semis' => 2, 'race_order' => 4, 'heat_nbr' => 2, 'racer_id' => 65, 'heat_finish' => 5, 'race_time' => '152.0000', ),    
15 => array ( 'nbr_of_semis' => 2, 'race_order' => 4, 'heat_nbr' => 2, 'racer_id' => 860, 'heat_finish' => 6, 'race_time' => '152.0000', ),    
16 => array ( 'nbr_of_semis' => 2, 'race_order' => 4, 'heat_nbr' => 2, 'racer_id' => 226, 'heat_finish' => 7, 'race_time' => '152.0000', )    
);    

$n = count($arr);    
//loop that prints the array    
for($i = 0; $i < $n; $i++)    
    echo nl2br("Sort Order:". $i ." Race Order:" . $arr[$i]['race_order'] . "| Heat Number:" . $arr[$i]['heat_nbr'] . "| Racer:" . $arr[$i]['racer_id'] . "| Heat Finish:" . $arr[$i]['heat_finish'] . "| Race Time:" . $arr[$i]['race_time']."\n");    

//loop that separates and sorts the racers according to their race_order    
$max = 0;           //variable that will use to determine the maximum size of race_order    
for($i = 0; $i < $n; $i++){    
    if($i == 0)    
        $arr1[] = $arr[$i];    
    else{    
        if($arr[$i]['race_order'] == $arr[$i-1]['race_order'])    
            $arr1[] = $arr[$i];    
        else{    
            sortArr($arr1);    
            $arr2[] = $arr1;    
            if($max < count($arr1))    
                $max  = count($arr1);    
            unset($arr1);    
            $arr1[] = $arr[$i];    
        }    
    }    
}    
$arr2[] = $arr1;    

//destroy the current array    
unset($arr);    


//loop to combine the sorted arrays    
for($i = 0; $i < $max; $i++){    
    for($j = 0; $j < count($arr2); $j++){    
        if(count($arr2[$j]) > $i)    
            $arr[] = $arr2[$j][$i];    
    }    
}    

echo nl2br("Sorted\n");    
for($i = 0; $i < $n; $i++)    
    echo nl2br("Sort Order:". $i ." Race Order:" . $arr[$i]['race_order'] . "| Heat Number:" . $arr[$i]['heat_nbr'] . "| Racer:" . $arr[$i]['racer_id'] . "| Heat Finish:" . $arr[$i]['heat_finish'] . "| Race Time:" . $arr[$i]['race_time']."\n");    

1 个答案:

答案 0 :(得分:3)

这里出错:

hh:mm:ss

$ max是一个基于$ arr1的count()的值,你应该这样做

like

否则它永远不会解析最后一个值,就像这里发生的一样。 :)

相关问题