PHP-----二维数组和二分查找

二维数组由行和列组成。由arr[$i][$j]表示,先后表示行和列,类似于坐标点。

打印二维数组-----通过两次遍历,第一次遍历每一行,第二次遍历每一行的具体元素,并且通过使用count($arr[$i])---代表每一行有几个元素,使代码适应性更好,可以打印不规则的二维数组。

转置矩阵-----颠倒行和列的值,然后再次遍历即可。

 1 <?php
 2     //1.打印一个二维数组
 3     $arr=array(
 4         array(1,2,3,4,5,6),
 5         array(2,2,3,1,2,5),
 6         array(0,9,8,7,5,0,9),
 7         array(3,5,6,7,8,3,5)
 8         );
 9     /*for($i=0;$i<count($arr);$i++){
10         for($j=0;$j<count($arr[$i]);$j++){
11             echo $arr[$i][$j]."&nbsp;";
12         }
13         echo "<br/>";
14     }*/
15     //转置上面的矩阵
16     for($i=0;$i<count($arr);$i++){
17         for($j=0;$j<count($arr[$i]);$j++){
18             $arr2[$j][$i]=$arr[$i][$j];
19         }
20     }
21     //遍历数组2
22     for($i=0;$i<count($arr);$i++){
23         for($j=0;$j<count($arr[$i]);$j++){
24             echo $arr[$i][$j]."&nbsp;";
25         }
26         echo "<br/>";
27     }
28 
29 ?>

顺序查找:直接通过遍历一次数组实现。

 1 $arr=array(1,2,4,6,7,8);
 2     function search(&$arr,$find){
 3         $flag=false;
 4         for($i=0;$i<count($arr);$i++){
 5             if($find==$arr[$i]){
 6                 echo 'find'.$i;
 7                 $flag=true;
 8                 break;
 9             }
10         }
11         if(!$flag){
12             echo 'Not find!';
13         }
14         $flag=false;
15     }
16     search($arr,4);

二分查找-----和快速排序的原理有点类似。首先排除特例,如果左边的下标大于右边直接退出(这表示数组不是有序数组);计算数组的中间下标值,并用round函数取整;如果需要查找的数大于数组的中间值,那么就把中间值的下标+1,如果需要查找的数小于数组的中间值,那么就把中间值的下标-1;如果需要查找的数等于数组的中间值,直接输出。二分查找运用了递归。

 1 //二分查找(必须是有序数组才能使用二分查找)
 2     function binaryFind(&$arr,$find,$leftIndex,$rightIndex){
 3         if($leftIndex>$rightIndex){
 4             echo 'not find';
 5             return;
 6         }
 7         $middleIndex=round(($leftIndex+$rightIndex)/2);//四舍五入
 8 
 9         if($find>$arr[$middleIndex]){
10             binaryFind($arr,$find,$middleIndex+1,$rightIndex);//右边增加了一个数
11         }elseif($find<$arr[$middleIndex]){
12             binaryFind($arr,$find,$leftIndex,$middleIndex-1);//左边增加了一个数
13         }else{
14             echo "$middleIndex";
15         }
16     }
17     $arr=array(1,2,4,6,7,8);
18     binaryFind($arr,0,0,count($arr)-1);//下标需要减一,去除查询数他本身

打印乘法表

1 //打印乘法表
2     for($i=1;$i<=9;$i++){
3         for($j=1;$j<=$i;$j++){
4             echo "$j*$i=".$i*$j;
5             echo '&nbsp;';
6         }
7         echo "<br/>";
8     }

评委打分小实例-----运用了假设的思想,一步一步的假设,然后判断可行性。

 1 //计算打分
 2     function findMin(&$arr){
 3         $minScore=$arr[0];
 4         $minIndex=0;
 5         for($i=1;$i<count($arr);$i++){
 6             if($minScore>$arr[$i]){
 7                 $minScore=$arr[$i];
 8                 $minIndex=$i;
 9             }
10         }
11         return $minIndex;
12     }
13     function findMax(&$arr){
14         $maxScore=$arr[0];
15         $maxIndex=0;
16         for($i=1;$i<count($arr);$i++){//$i=1;
17             if($maxScore<$arr[$i]){
18                 $maxScore=$arr[$i];
19                 $maxIndex=$i;
20             }
21         return $maxIndex;    
22         }
23     }
24     $arr=array(20,90,40,80,88,89,50);
25     $minIndex=findMin($arr);
26     $maxIndex=findMax($arr);
27 
28     $sum=0;
29     for($i=0;$i<count($arr);$i++){
30         if($i!=$minIndex && $i!=$maxIndex){
31             $sum+=$arr[$i];
32         }
33     }
34 
35     echo "key is".$minIndex."last score is".$arr[$minIndex]."<br/>";
36     echo "key is".$maxIndex."top score is".$arr[$maxIndex]."<br/>";
37     echo "平均成绩是".$sum/(count($arr)-2);
38     $avarage=$sum/(count($arr)-2);
39     //找出最佳评委
40     $different=abs($arr[0]-$avarage);//差值取绝对值,假设第一位就是最佳评委
41     $goodIndex=0;
42     for($i=0;$i<count($arr);$i++){
43         if($different>abs($arr[$i]-$avarage)){
44             $different=abs($arr[$i]-$avarage);
45             $goodIndex=$i;
46         }
47     }
48     echo "最佳评委是".$i;

成绩查询小实例

html页面----关于input元素的type类型

button 定义可点击按钮(多数情况下,用于通过 JavaScript 启动脚本)。
checkbox 定义复选框。
file 定义输入字段和 "浏览"按钮,供文件上传。
hidden 定义隐藏的输入字段。
image 定义图像形式的提交按钮。
password 定义密码字段。该字段中的字符被掩码。
radio 定义单选按钮。
reset 定义重置按钮。重置按钮会清除表单中的所有数据。
submit 定义提交按钮。提交按钮会把表单数据发送到服务器。
text 定义单行的输入字段,用户可在其中输入文本。默认宽度为 20 个字符。
 1 <html>
 2 <head>
 3     <title></title>
 4 </head>
 5 <body>
 6 <form action="arr2222.php" method="post">
 7     <input type="text" placeholder="请输入要搜索的学号" name="stuNum">
 8     <input type="hidden" name="doing" value="seaNum">
 9     <input type="submit" value="提交">
10 </form>
11 <form action="arr2222.php" method="post">
12     <input type="text" placeholder="请输入要搜索的成绩" name="stuGra">
13     <input type="hidden" name="doing" value="seaGra">
14     <input type="submit" value="提交">
15 </form>
16 <form action="arr2222.php" method="post">
17     <input type="hidden" name="doing" value="seaStep">
18     <input type="submit" value="查询成绩范围">
19 </form>
20 </body>
21 </html>

php页面-----通过判断name==value来选择执行那一块的代码;运用$flag变量来控制if判断流程;最后一个elseif创建了一个虚拟的数组来存放学生成绩。

 1 <?php
 2     $arr=array(20,56,59,80,90,100,88,81,79,66,59);
 3     $doing=$_REQUEST['doing'];
 4     //$seaStep=$_REQUEST['seaStep'];
 5 
 6     function showGrade($stuNum,&$arr){
 7         return $arr[$stuNum];
 8     }
 9     function showNum($stuGra,&$arr){
10         $flag=false;
11         for($i=0;$i<count($arr);$i++){
12             if($stuGra==$arr[$i]){
13                 echo '学号为'.$i.'成绩为'.$stuGra;
14                 $flag=true;
15             }
16         }
17         if($flag==false){
18             echo "没有此成绩";
19         }
20     }
21 
22     if($doing=='seaNum'){
23         $stuNum=$_REQUEST['stuNum'];//接受的是序号
24         echo "该学生的成绩是".showGrade($stuNum,$arr);
25     }elseif($doing=='seaGra'){
26         $stuGra=$_REQUEST['stuGra'];
27         showNum($stuGra,$arr);
28     }elseif($doing=='seaStep'){
29         
30         $arr2=array(0,0,0,0,0);
31 
32         for($i=0;$i<count($arr);$i++){
33             if($arr[$i]>=0 && $arr[$i]<=59){
34                 $arr2[0]+=1;
35             }elseif($arr[$i]>=60 && $arr[$i]<=69){
36                 $arr2[1]+=1;
37             }elseif($arr[$i]>=70 && $arr[$i]<=79) {
38                 $arr2[2]+=1;
39             }elseif($arr[$i]>=80 && $arr[$i]<=89) {
40                 $arr2[3]+=1;
41             }elseif($arr[$i]>=90 && $arr[$i]<=100) {
42                 $arr2[4]+=1;
43             }
44         }
45         echo "1----".$arr2[0].'<br/>'."2----".$arr2[1].'<br/>'."3----".$arr2[2].'<br/>'."4----".$arr2[3].'<br/>'."5----".$arr2[4];
46     }
47 ?>
posted @ 2014-02-14 22:07  Paxster  阅读(1768)  评论(0编辑  收藏  举报