zoukankan      html  css  js  c++  java
  • 【三】php 数组

     数组 

    1.数字索引数组:array('a','b','c'); 
    2.访问数组内容 $arr[下标]
    3.新增数组元素 $arr[下标]=内容
    4.使用循环访问数组
    //针对数字索引
    $arr=array("a","b","c");
    for ($i=0;$i<count($arr);$i++){
        echo $arr[$i];
    }
    //数字索引和字符串索引
    $arrStr=array("arr1"=>"value1","hello");
    foreach ($arrStr as $arr){
        echo $arr;
    }
    5.关联数组:$arrStr=array("arr1"=>"value1","hello");
    6.遍历数组
    //---------------针对数字索引-----------------
    $arr=array("a","b","c");
    for ($i=0;$i<count($arr);$i++){
        echo $arr[$i];
    }
    //---------------针对数字索引和字符串索引-----------------
    $arrStr=array("arr1"=>"value1","hello");
    foreach ($arrStr as $key=> $arr){
        echo $key."---".$arr;
    }
    /**
    * each:按顺序返回数组中的每个元素
    * $arr是一个数组,调用each的时候会返回4个参数 0、1、key、value
    */
    while($arr=each($arrStr)){ //已弃用
        echo $arr[0];
        echo $arr[1];
    }
    /*
    * list()可以用来将一个数组分解成一系列的值
    * reset将数组的内部指针重置到数组中的第一个元素
    */
    reset($arrStr);
    while(list($k,$v)=each($arrStr)){
        echo $k.$v;
    }
    7.排序
    • sort:按照字母或者数字排序(key 升序)ps:key值会变成数字索引
    • asort:根据value值排序(value 升序)
    • ksort:根据key值排序(key 升序)
    • rsort:(key 降序)ps:key值会变成数字索引
    • arsort:(value 降序)
    • krsort:(key 降序)
    • usort:使用用户自定义的函数对数组进行排序
    $products=array(array('tir','aires',100),
                array('oil','oil',10),
                array('spk','spark plugs',4));
    function compare($x,$y){
        if ($x[1]==$y[1]){
        return 0;
    }elseif ($x[1]<$y[1]){
        return -1;
    }else{
        return 1;
    }
    }
    usort($products,'compare');
    var_dump($products);       
    • shuffle():随机排序
    • array_reverse():给出一个原来数组的反向排序
    反向排序自实现:
    $numbers=array();
    for ($i=count($products);$i>0;$i--){
        array_push($numbers,$products[$i-1]);
    }
    var_dump($numbers); 
    8.从文件载入数组 
    /**
    * file:将文件内容写进数组中,以行分割
    * count:统计数组中有多少个元素
    * explode:将传入的字符串分割成小块
    */
    $root=$_SERVER['DOCUMENT_ROOT'];
    $orders=file("$root/test.txt");
    $number=count($orders);
    if ($number==0){
        echo "no orders pending";
    }
    for ($i=0;$i<$number;$i++){
    $line=explode(" ",$orders[$i]);
        echo $line[0]."<br/>";
        var_dump($line);
    }
    9.其他数组函数
    /**
    * 将数组反向显示
    *current:返回第一个元素
    *next、each:返回当前元素
    * end:指针移到最后一个元素
    * reset:指针移到第一个元素
    * prev:与next相反,将指针往回移一个位置在返回新的当前元素
    */
    $a=array(2,333,22,22,34);
    $value=end($a);
    while($value){
        echo $value."<br/>";
        $value=prev($a);
    }
    count、sizeof:统计数组个数
    array_count_values:统计数组中的value值出现了多少次 
    extract:通过一个数组创建一系列的标量常量 ps:该元素关键字必须是一个有效的变量名,如果以数字或包含空格的关键字将会被跳过
    $array=array('key1'=>'value1','key2'=>'value2');
    extract($array);
    echo $key1;

    ex1需求:将一个二维数组内的值转置

    <?php
        $arr=array(
            array("name"=>"huahua","age"=>"15"),
            array("name"=>"caicai","age"=>"18")
            );
        echo "排序前<br/>";
        //转置思路:
        //1.循环外层的数组,确定里面数组的值
        //2.循环里层,将他的下标置换,并打印出来
        for ($i=0; $i <count($arr) ; $i++) { 
             foreach ($arr[$i] as $key => $value) {
                 echo $arr[$i][$key]."&nbsp;";
             }
        echo "<br/>";        
            }
            var_dump($arr);
        echo "排序后<br/>";
        // 思路:
        // 1.先新建一个数组
        // 2.在循环将下标值替换掉,将替换后的值新增到新数组
        // 3.遍历新数组,将值打印出来
        // echo count($arr);
        // 新建数组,在多维数组下的key值取出,作为新数组的key
        foreach ($arr[0] as $key => $value) {
                     $arr1[$key]=array();
                 }
    
        // var_dump($arr1);
        // 循环老数组,将置换value值赋给新数组
        for ($i=0; $i <count($arr) ; $i++) { 
                 foreach ($arr[$i] as $key => $value) {
                     $arr1[$key][$i]=$arr[$i][$key];    //往老数组新增值
                 }
            echo "<br/>";        
                }
         var_dump($arr1);
         //遍历老数组,将key和value值打印出来
        foreach ($arr1 as $a=>$b) {
            foreach ($b as $key => $value) {
                echo $arr1[$a][$key]."&nbsp;";
            }
            echo "<br/>";
        }
        
    ?>

    结果:

    ex2:找出一组数组中最大值、最大值的角标、最小值、最小值的角标及平均数 

    需求:现有一组评委打分的数据。

    1. 求出他们的最大值与最小值。
    2. 最大值最小值的角标
    3. 去除最大值与最小值后的平均数
    4. 找出最佳评委与最差评委

    代码: 

     2 <?php
     3     $arr=array(1,2,3,4);
     4     //最小值
     5     //思路:44,5,3,333,445,99,54,332,-6
     6     // 1.定义变量,一个记录下标$index,一个记录最小值$minvalue
     7     // 2.假如最小值为下标为0的数
     8     // 3.拿认为最小的值与该数组内的数比较
     9     // 4.如果$minvalue大于数组内的某个数,则说明这个数不是最小值。交换下标与最小值
    10     function minfunction($arr){
    11         $index=0;
    12         $minvalue=$arr[0];
    13         for ($i=1; $i <count($arr) ; $i++) { 
    14             if ($minvalue>$arr[$i]) {
    15                 $index=$i;
    16                 $minvalue=$arr[$i];
    17             }
    18         }
    19         return $index;
    20     }
    21     $a=minfunction($arr);
    22     // echo $a;
    23     echo "最小值为$a,他的分数为$arr[$a]";
    24     echo "<br/>";
    25     //最大值
    26     // 思路:与最小值思路一样
    27     function maxfunction($arr){
    28     $index=0;
    29     $minvalue=$arr[0];
    30     for ($i=1; $i <count($arr) ; $i++) { 
    31         if ($minvalue<$arr[$i]) {
    32             $index=$i;
    33             $minvalue=$arr[$i];
    34         }
    35     }
    36     return $index;
    37 }
    38     $b=maxfunction($arr);
    39     // echo $a;
    40     echo "最大值为$b,他的分数为$arr[$b]";
    41     echo "<br/>";
    42     // 平均数
    43     // 思路:
    44     //定义一个变量记录总分数
    45     // 2.将除最大值与最小值以外的值相加
    46     // 3.除以count($arr)-2就得到平均值了
    47     $sum=0;
    48     for ($i=0; $i <count($arr) ; $i++) { 
    49         // echo $a."===".$b."---".$i."<br/>";
    50         // $c=($i!=$a) && ($i!=$b);
    51         // var_dump($c);
    52         //注意:以下条件&&的意思两者都为真,才执行如下语句
    53         if (($arr[$i]!=$arr[$a]) && ($arr[$i]!=$arr[$b])) {            
    54             $sum+=$arr[$i];
    55             // echo $sum."<br/>";
    56         }
    57     }
    58     echo "除去最大值与最小值的总分为$sum"."<br/>";
    59     echo "平均数为".$sum/(count($arr)-2);
    60     echo "<br/>";
    61     //找出最佳评委与最差评委
    62     // 思路:
    63     // 1.先找出平均数
    64     // 2.定义一个变量为最佳评委,互相去比较
    65     // 3.遍历老数组,比较平均数与哪个值相差的最少,就是最佳评委
    66     $avg=$sum/(count($arr)-2);
    67     echo "$avg<br/>";
    68     $goodindex=0;
    69     $goodgrades=abs($arr[0]-$avg);
    70     for ($i=1; $i <count($arr) ; $i++) { 
    71         if ($goodgrades>abs($avg-$arr[$i])) {
    72             $goodperson=$i;
    73             // echo $goodperson."<br/>";
    74             $goodgrades=abs($avg-$arr[$i]);
    75         }
    76 
    77     }
    78             echo "最佳评委的分数为$arr[$goodperson]";
    79 ?

    结果:

    在做题过程中遇到的错点:

    • 第52行值的比较,写成了($arr[$i]!=$arr[$a]) && ($arr[$i]!=$arr[$b]),当然这样执行结果也是对的。对下标进行比较更方便快捷
    • 第52行运算符,写成了||。之后一直在纠结怎么4个数他都算进去了。= =(沉默一阵)。原来是运算符用错了。必须两个都为真,才叠加sum的值

     总结:

    1. 求最大值与最小值,使用循环遍历排序(排序方法:冒泡排序、选择排序、快递排序)
    2. 运算符:&&、and(都为true) 、or ||(任一为true) 。详情参照http://www.cnblogs.com/8013-cmf/p/7722966.html

    需求3:定义个数组,用户输入不同的10个成绩,数组代表学生学号

    1. 输入学号,打印该学生成绩
    2. 输入成绩,打印fai学生学号
    3. 统计各个分数阶段下的学生人数
    4. 输入学号,删除该学生的成绩

    代码:view.php

     1 <!-- 前端思路: --> 
     2 <!-- 1.写多个form表单,因为每次查询的条件不同 -->
     3 <!-- 2.在每个表单内,需写一个隐藏表单,便于接收页面判断是要调用哪个功能 -->
     4 <html>
     5 <head></head>
     6 <body>
     7 <h1>学生成绩管理系统</h1>
     8 <!-- 该表单定义查询成绩的学号 -->
     9 <form action="homework.php" method="post">
    10     <p>请输入10个学生成绩<input type="text" name="grades"></p><br/>
    11     请输入学生学号<input type="text" name="xuehao">
    12         <!-- 隐藏表单 -->
    13     <input type="hidden" name="doing" value="xh">
    14     <input type="submit" value ="查询学号的成绩">
    15 </form>
    16 <!-- 该表单定义查询成绩的学号 -->
    17 <form action="homework.php" method="post">
    18         请输入成绩<input type="text" name="chengji">
    19             <!-- 隐藏表单 -->
    20     <input type="hidden" name="doing" value="cj">
    21     <input type="submit" value="查询成绩的学号" >
    22 </form>
    23 <!-- 该表单用于查询分类成绩(不及格,良好,优秀)有多少个学生 -->
    24 <form action="homework.php" method="post">
    25     <input type="hidden" name="doing" value="fl">
    26     <input type="submit" value="查询成绩分类的整体情况" >
    27 </form>
    28 <!-- 输入学号,将删除该学生的成绩 -->
    29 <form action="homework.php" method="post">
    30         请输入学号<input type="text" name="shanchu">
    31             <!-- 隐藏表单 -->
    32     <input type="hidden" name="doing" value="sc">
    33     <input type="submit" value="删除该学号的成绩" >
    34 </form>
    35 </body>
    36 </html>

    homework.php

     1 <?php
     2 // 思路:
     3 // 1.先接收隐藏表单所传过来的值
     4 // 2.判断是要调去哪一个功能
     5     $arr=array(22,45,99,54,2,88);
     6     function findgrade($arr,$stuxuehao){
     7         return $arr[$stuxuehao];
     8     }
     9     $doing=$_REQUEST["doing"];
    10     if ($doing=='xh') {
    11         $stuxuehao=$_REQUEST["xuehao"];
    12         echo "学号为".$stuxuehao."的成绩为".findgrade($arr,$stuxuehao);
    13     }elseif ($doing=='cj') {
    14         $stuchengji=$_REQUEST["chengji"];
    15         // 1.用成绩与数组中的数值比较,相等的那个数的下标就是成绩的学号了
    16         //2.定义一个变量,标记是否有在数组中查找到该成绩
    17         //3.如果该标记值没有被改变,则输入“您查询的成绩没有学号”
    18         $flag=false;
    19         for ($i=0; $i <count($arr) ; $i++) { 
    20         if ($stuchengji==$arr[$i]) {
    21             echo "您查询的该成绩的学号为".$i;
    22             $flag=true;
    23         }
    24     }
    25     if (!$flag) {
    26             echo "您查询的成绩没有学号";
    27         }
    28     }elseif ($doing=="fl") {
    29         // 思路:
    30         // 1.将成绩的分类定义为一个数组(59分以下不及格,60-69分及格,70-85分良好,86-100分优秀)
    31         // 2.遍历老数组的值,将该值与分类成绩做比较
    32         // 3.属于哪个分类,哪个分类的value值就+1
    33         $arr1=array(0,0,0,0);
    34         for ($i=0; $i <count($arr) ; $i++) { 
    35             if ($arr[$i]>=0 && $arr[$i]<=59) {
    36                 $arr1[0]+=1;
    37             }elseif ($arr[$i]>=60 && $arr[$i]<=69) {
    38                 $arr1[1]+=1;
    39             }elseif ($arr[$i]>=70 && $arr[$i]<=85) {
    40                 $arr1[2]+=1;
    41             }else{
    42                 $arr1[3]+=1;
    43             }
    44         }
    45         echo "不及格的人数有".$arr1[0]."<br/>";
    46         echo "及格的人数有".$arr1[1]."<br/>";
    47         echo "良好的人数有".$arr1[2]."<br/>";
    48         echo "优秀的人数有".$arr1[3]."<br/>";
    49     }elseif ($doing=="sc") {
    50         // 思路:
    51         // 1.接收需删除的学号值
    52         // 2.删除数组中对应学号值的成绩
    53         $stushanchu=$_REQUEST["shanchu"];
    54         unset($arr[$stushanchu]);
    55         var_dump($arr);
    56     }    
    57 ?>

    结果:

    练习过程中遇到的难点:

    1. view.php中的13行隐藏表单,纠结了很久到底是怎么传值给别的页面做判断
    2. view.php中多个form
    3. homework.php中的接收参数。

    总结:

    1. hidden表单传值通过name来识别,但判断的值为value值。比如$doing=$_REQUEST["doing"]; if ($doing=='xh')
    2. 多个form是为了判断点击事件
    3. 接收值$_REQUEST["doing"],是使用的[]中括号,而不是()

    ex4:以objid以日期为间隔,使用json格式打印出来

     =》(变成)

    方法一:

     1 <?php
     2         $arr = array(
     3             0=>array("dataname"=>"2017-08-08","objID"=>"11"),
     4             1=>array("dataname"=>"2017-08-08","objID"=>"12"),
     5             2=>array("dataname"=>"2017-08-08","objID"=>"13"),
     6             3=>array("dataname"=>"2017-08-09","objID"=>"14"),
     7             4=>array("dataname"=>"2017-08-09","objID"=>"15"),
     8             5=>array("dataname"=>"2017-08-09","objID"=>"16"),
     9             6=>array("dataname"=>"2017-08-10","objID"=>"17"),
    10             7=>array("dataname"=>"2017-08-10","objID"=>"18"),
    11             8=>array("dataname"=>"2017-08-10","objID"=>"19"),
    12             9=>array("dataname"=>"2017-08-11","objID"=>"20"),
    13             10=>array("dataname"=>"2017-08-11","objID"=>"21"),
    14             11=>array("dataname"=>"2017-08-11","objID"=>"22")
    15         );
    16         //思路
    17         //1.新建一个空数组
    18         //2.便利老数组
    19         //3.判断老数组的dataname值在新数组是否存在
    20         //如果不存在则在新数组新建dataname及objid值。
    21         //如果存在则去判断对应的objid值在新数组,记录最后一次出现的位置,如果为false,则往对应的dataname下添加objid值
    22         $arr1=[];
    23         foreach ($arr as $k => $v) {
    24             if (array_key_exists($v["dataname"],$arr1)) {
    25                 //strpos:查找“$v['objID']”在“$arr1[$v['dataname']]['objID']”中最后一次出现的位置
    26                 $res=strpos($arr1[$v['dataname']]['objID'],$v['objID']);
    27                 if ($res===false) {
    28                     $arr1[$v['dataname']]['objID'].=",".$v['objID'];
    29                 }
    30             }else{
    31                 $arr1[$v['dataname']]['objID']=$arr[$k]['objID'];
    32             }
    33         }
    34         var_dump($arr1);
    35 ?>

    结果:

    方法二:

     1 <?php
     2 $arr = array(
     3     0=>array("dataname"=>"2017-08-08","objID"=>"11"),
     4     1=>array("dataname"=>"2017-08-08","objID"=>"12"),
     5     2=>array("dataname"=>"2017-08-08","objID"=>"13"),
     6     3=>array("dataname"=>"2017-08-09","objID"=>"14"),
     7     4=>array("dataname"=>"2017-08-09","objID"=>"15"),
     8     5=>array("dataname"=>"2017-08-09","objID"=>"16"),
     9     6=>array("dataname"=>"2017-08-10","objID"=>"17"),
    10     7=>array("dataname"=>"2017-08-10","objID"=>"18"),
    11     8=>array("dataname"=>"2017-08-10","objID"=>"19"),
    12     9=>array("dataname"=>"2017-08-11","objID"=>"20"),
    13     10=>array("dataname"=>"2017-08-11","objID"=>"21"),
    14     11=>array("dataname"=>"2017-08-11","objID"=>"22")
    15 );
    16     // 思路:
    17     // 1.先新建2个空数组
    18     // 2.先判断老数组的$i是否等于1
    19     // 等于1,在数组1添加该objid值。且数组2[‘dataname’]等于数组1
    20     // 不等于1,则判断老数组的$i-1行的dataname值是否与$i值相等
    21     // 如果相等,则在对应的dataname下添加对应的objid值
    22     // 如果不相等,则代表在该dataname下,无objid(新建objid值)
    23     $temp=array();
    24     for ($i=0; $i <count($arr) ; $i++) { 
    25         $dataname=$arr[$i]['dataname'];
    26         $objID=$arr[$i]['objID'];
    27         if ($i==0) 
    28         {
    29             $temp['objID']=$objID;        
    30         }else
    31         {
    32             $lastDataname=$arr[$i-1]['dataname'];
    33             if ($dataname==$lastDataname) 
    34             {
    35                 $temp['objID']=$temp['objID'].",".$objID;
    36             }else{
    37                 $temp['objID']=$objID;
    38             }
    39         }
    40         $arr2[$dataname]=$temp;
    41     }
    42     var_dump($arr2);
    43 ?>

    结果:

     方法三:

    <?php
    $arr = array(
        0=>array("dataname"=>"2017-08-08","objID"=>"11"),
        1=>array("dataname"=>"2017-08-08","objID"=>"12"),
        2=>array("dataname"=>"2017-08-08","objID"=>"13"),
        3=>array("dataname"=>"2017-08-09","objID"=>"14"),
        4=>array("dataname"=>"2017-08-09","objID"=>"15"),
        5=>array("dataname"=>"2017-08-09","objID"=>"16"),
        6=>array("dataname"=>"2017-08-10","objID"=>"17"),
        7=>array("dataname"=>"2017-08-10","objID"=>"18"),
        8=>array("dataname"=>"2017-08-10","objID"=>"19"),
        9=>array("dataname"=>"2017-08-11","objID"=>"20"),
        10=>array("dataname"=>"2017-08-11","objID"=>"21"),
        11=>array("dataname"=>"2017-08-11","objID"=>"22")
    );
    $data=array();
    foreach($arr as $k=>$v){
        if (array_key_exists($v["dataname"],$data)){
            $data[$v["dataname"]]["objID"]=$data[$v["dataname"]]["objID"].",".$v["objID"];
        }else{
            $data[$v["dataname"]]["objID"]=$v["objID"];
        }
    }
    var_dump($data);
  • 相关阅读:
    用 Python 带你看各国 GDP 变迁
    Fluent Interface(流式接口)
    probing privatePath如何作用于ASP.NET MVC View
    Word插入htm文件导致文本域动态增加的一个问题
    Visual Studio 2013附加进程调试IE加载的ActiveX Control无效解决方法
    Ubuntu下Chrome运行Silverlight程序
    Windows Phone Bing lock screen doesn't change解决方法
    SPClaimsUtility.AuthenticateFormsUser的证书验证问题
    Web Service Client使用Microsoft WSE 2.0
    Visual Studio 2013安装Update 3启动crash的解决方法
  • 原文地址:https://www.cnblogs.com/8013-cmf/p/7811876.html
Copyright © 2011-2022 走看看