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);
  • 相关阅读:
    oraclesqlloader
    Dosinternal command and external command
    unixexpr
    Powerbuilder 6.5完全图解教程
    character set
    pbdatawindow function
    java decompile tool(recommended)
    php验证码背景色设置无效
    使用jquery validation engine判断为空的时候要根据input的type
    有些站点不能被iframe
  • 原文地址:https://www.cnblogs.com/8013-cmf/p/7811876.html
Copyright © 2011-2022 走看看