zoukankan      html  css  js  c++  java
  • PHP数组

    一、数组初步

    ①概念:数组是一种数据的集合,数组主要是用于存储具有行列特征(表格)的数据

    ②PHP数组的分类

    • 索引数组:数组的下标是整数
    • 关联数组:数组的下标是字符串

    ③PHP数组的创建

    • php中数组元素由两部分组成,键名【下标】和键值
    • 索引数组的创建,可以显示创建,也可以隐式创建,创建的数组,下标可以不连续

    • 关联数组的创建:,可以显示创建,也可以隐式创建

    ④多维数组:PHP中支持多维数组,如果一个数组的元素又是一个数组,那么这就是多维数组,实际开发中,一般二维数组比较常见

    <?php
        //显式创建
        $arr1=array(
            'goods0'=>array('id'=>10,'brand'=>'mi5','price'=>1999),
            'goods1'=>array('id'=>11,'brand'=>'mi6','price'=>2666),
            'goods2'=>array('id'=>12,'brand'=>'note3','price'=>2199),
            'goods3'=>array('id'=>13,'brand'=>'mi8','price'=>2999)
            );
        $arr2=[
            'goods0'=>array('id'=>10,'brand'=>'mi5','price'=>1999),
            'goods1'=>array('id'=>11,'brand'=>'mi6','price'=>2666),
            'goods2'=>array('id'=>12,'brand'=>'note3','price'=>2199),
            'goods3'=>array('id'=>13,'brand'=>'mi8','price'=>2999)
            ];
        //隐式创建
        $arr3=array();
        $arr3['goods0']=array('id'=>10,'brand'=>'mi5','price'=>1999);
        $arr3['goods1']=array('id'=>11,'brand'=>'mi6','price'=>2666);
        $arr3['goods2']=array('id'=>12,'brand'=>'note3','price'=>2199);
        $arr3['goods3']=array('id'=>13,'brand'=>'mi8','price'=>2999);
        echo '<pre>';
        print_r($arr1);
        print_r($arr2);
        print_r($arr3);
    ?>

    ⑤数组元素的访问

    • 一维数组的访问:$数组名[ 下标/ '键名' ]
    <?php
        //一维索引数组的访问
        $arr1=[10,20,30,40];
        echo $arr1[0],'<br>';//10
        echo $arr1[1],'<br>';//20
        echo $arr1[2],'<br>';//30
        echo $arr1[3],'<br>';//40
        //一维关联数组的访问
        $arr2=array('id'=>10,'brand'=>'note3','price'=>1999);
        echo $arr2['id'],'<br>';//10
        echo $arr2['brand'],'<br>';//note3
        echo $arr2['price'];//1999
    ?>
    • 二维数组的访问:$数组名[ 行下标 ] [ 列下标 ]
    <?php
        $arr=array(
            'goods0'=>array('id'=>10,'brand'=>'mi5','price'=>1999),
            'goods1'=>array('id'=>11,'brand'=>'mi6','price'=>2666),
            'goods2'=>array('id'=>12,'brand'=>'note3','price'=>2199),
            'goods3'=>array('id'=>13,'brand'=>'mi8','price'=>2999)
        );
        echo $arr['goods1']['id'];//11
        echo $arr['goods2']['brand'];//note3
        echo $arr['goods3']['price'];//2999
    ?>

    ⑥数组的长度:count($数组名)

    <?php
        //一维数组的长度
        $arr1=[10,20,30,40];
        $arr2=array('id'=>10,'brand'=>'note3','price'=>1999);
        echo count($arr1);//4
        echo count($arr2);//3
        //二维数组的长度
        $arr3=array(
            'goods0'=>array('id'=>10,'brand'=>'mi5','price'=>1999),
            'goods1'=>array('id'=>11,'brand'=>'mi6','price'=>2666),
            'goods2'=>array('id'=>12,'brand'=>'note3','price'=>2199),
            'goods3'=>array('id'=>13,'brand'=>'mi8','price'=>2999)
        );
        echo count($arr3);//4----行数
        echo count($arr3['goods0']);//3-----具体行的列数
    ?>

    二、数组的指针:用于表示当前所关注的元素

    ①current($arr)用于当前指针所指向的元素的键值

    ②key($arr)用于当前指针所指向的元素的键名

    ③next($arr)用于将数组的指针下移

    ④prev($arr)用于将数组的指针上移

    ⑤reset($arr)用于将数组的指针重置归位(默认位置是第一个元素)

    ⑥end($arr)用于将数组的指针移到最后的一个元素

    <?php
        
        $arr=array('id'=>10,'brand'=>'note3','price'=>1999);
        echo key($arr),'=>',current($arr),'<br>';//id=>10----默认位置
        next($arr);
        echo key($arr),'=>',current($arr),'<br>';//brand=>note3----向下移动
        prev($arr);
        echo key($arr),'=>',current($arr),'<br>';//id=>10----向上移动
        end($arr);
        echo key($arr),'=>',current($arr),'<br>';//price=>1999-----移到最后
        reset($arr);
        echo key($arr),'=>',current($arr),'<br>';//id=>10-----重置归位
       
    ?>

    三、数组的遍历

    ①for循环:使用循环控制变量来模拟下标的方式来遍历数据,只能遍历连续或有规则的数组,但不能遍历下标不同且不规律的数组,或者是下标是字符串的关联数组

    <?php
        $arr=[10,20,30,40,50];
        for($i=0;$i<count($arr);$i++){
            echo $arr[$i],'<br>';//10 20 30 40 50 
        }
    ?>

    ②foreach

    • 语法: foreach($arr as 【$key=>】$value){ 循环体}   $arr是数组,$key和$value是一个可以自己定义的变量
    <?php
        $arr=array('id'=>10,'brand'=>'note3','price'=>1999);
        foreach($arr as $k=>$v){
            echo $k,'=>',$v,'<br>';//id=>10   brand=>note3     price=>1999
        }
    ?>
    • foreach中没有出现类似于数组名【下标】这样的代码,所以foreach不是通过下标的方法来遍历数组,而是通过指针
    • 原理:首先对数组的指针进行重置,然后读取当前指针所指向的数组元素,并将元素的键名赋值变量$key,将键值赋值给变量$value,同时会将数组下移一行(为了下一次循环),foreach不需要控制循环变量的次数,它会自动判断什么什么时候结束循环

    ③while-each-list:使用while循环,each函数,list语法结构联合来遍历数组

    • each(数组) 用于获取当前指针所指向的元素键名和键值,数组返回,并以索引元素与关联元素两种形式表示,同时将指针下移一行

    • list(变量列表)=$arr 将数组$arr中的索引元素赋值给变量列表中的变量
    <?php
        $item=array('1'=> 10,'value' => 10,'0' => 'id','key' => 'id');
        list($k,$v)=$item;
        echo $k,'<br>',$v;//id  10
    ?>
    • while-each-list 遍历数据,注意赋值语句也可以作为while的表达式判断条件
    <?php
        $arr=array('id'=>10,'brand'=>'note3','price'=>1999);
        while(list($k,$v)=each($arr)){
            echo $k,'=>',$v,'<br/>';//id=>10   brand=>note3   price=>1999
        }
    ?>
    • foreach和list连用
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <?php
        //模拟从数据库得到的数据
        $arr=[
            [1,'xiaomi','mi8',2999],
            [2,'huawei','mate20',5999],
            [3,'Apple','x',8999],
            [4,'vivo','x20',3999]
        ];
    ?>
    <body>
        <table border='1' rules='all'>
            <thead>
                <tr>
                    <th>id</th>
                    <th>品牌</th>
                    <th>品名</th>
                    <th>价格</th>
                </tr>
            </thead>
            <tbody>
                <?php foreach($arr as list($id,$brand,$name,$price)){?>
                    <tr>
                        <td><?php echo$id;?></td>
                        <td><?php echo$brand;?></td>
                        <td><?php echo$name;?></td>
                        <td><?php echo$price;?></td>
                    </tr>
                <?php }?>
            </tbody>
        </table>
    </body>
    </html>

    四、数组操作常用的函数

    ①数组的长度:count(数组名)

    ②获取数组元素的键名和键值

    • array_keys ( ) 获取数组元素的键名,数组返回
    • array_values( ) 获取数组元素所有键值,数组返回

    ③判断键名和键值是否存在

    • array_key_exists ( key,arr )  用于判断某个键名key是否存在数组arr中
    • in_array( value,arr )  用于判断某个键值value是否存在数组arr中
    <?php
        $arr=array('id'=>10,'brand'=>'note3','price'=>1999);
        $key=array_keys($arr);
        $value=array_values($arr);
        var_dump(array_key_exists('brand',$arr));//bool(true) 
        var_dump(in_array('1999',$arr));//bool(true)
    ?>
    • 扩展:使用isset( )和empty( )判断
    <?php
        $arr=array('id'=>10,'brand'=>'note3','price'=>1999);
        if($arr['foo']){
            echo $arr['foo'];
        }else{
            echo '没有';
        }
        //上面的输出结果是:Notice: Undefined index: foo in E:WAMPApache2.4htdocs	est.php on line 3 没有
        //这种类似于JavaScript的方式,虽然可以达到效果,但是会有警告
        //只有当php.ini中display_errors=On 的时候,才会在页面上显示notice错误
        //开发阶段一定设置为on,生产阶段(上线)设置为off
        //isset 也可以判断数组中是否有指定的键,isset会吞掉undefined index的警告
        if(isset($arr['foo'])){
            echo $arr['foo'];
        }else{
            echo '没有';
        }
        //上面的输出结果是:没有
        //empty也可以达到和isset的效果
        //empty($arr['foo'])相当于!isset($arr['foo']) || $arr['foo']==false
        if(empty($arr['foo'])){
            echo '没有';
        }else{
            echo $arr['foo'];
        }
        //上面的输出结果是:没有
        //补充一个JavaScript的容易出错的点
        //在js的判断条件里:
        //0==false  ------true
        //1==false  ------false
        //'123'==false  ------false
        //''==false  ------false
        //'0'==false  ------true(特别注意的点,它是先把字符串转为number0 ,然后在比较0==false,所以结果是true)
    ?>

    ④数组合并:array_merge ( 数组1,数组2,.....)

    <?php
        $arrA=[10,20,30];
        $arrB=['a','b','c'];
        $return=array_merge($arrA,$arrB);
        print_r($return);//Array ( [0] => 10 [1] => 20 [2] => 30 [3] => a [4] => b [5] => c )
    ?>

    ⑤数组排序

    • sort(数组)对数组按键值进行升序排序,原来的下标会改变
    • rsort(数组)对数组按键值进行降序排序,原来的下标会改变

    • asort(数组)对数组按键值进行升序排序,原来的下标不会改变
    • rasort(数组)对数组按键值进行降序排序,原来的下标不会改变

    ⑥解压数组 :extract(数组)将关联元素转化为以键名为变量名的变量

    <?php
        $arr=array('id'=>10,'brand'=>'note3','price'=>1999);
        extract($arr);
        echo $id,'<br>';//10
        echo $brand,'<br>';//note3
        echo $price,'<br>';//1999
    ?>

    ⑦去掉重复的数组,指的是值相同 array_unique()

    <?php
        $a=array("a"=>"red","b"=>"green","c"=>"red");
        print_r(array_unique($a));//Array ( [a] => red [b] => green )
    ?>

    ⑧将一个或多个元素追加到数组中 array_push(array,value1,value2...)

    <?php
        $a=array("red","green");
        array_push($a,"blue","yellow");
        print_r($a);//Array ( [0] => red [1] => green [2] => blue [3] => yellow )
    ?>

    ⑨删除数组最后一个元素 array_pop()

    <?php
        $a=array("red","green","blue");
        array_pop($a);
        print_r($a);//Array ( [0] => red [1] => green )
    ?>

    ⑩搜索某个键值,并返回对应的键名 array_search(value,array,strict)

    <?php
        //array_search() 函数与 in_array() 一样,在数组中查找一个键值。
        //如果找到了该值,匹配元素的键名会被返回。如果没找到,则返回 false。
        //如果第三个参数 strict 被指定为 true,则只有在数据类型和值都一致时才返回相应元素的键名。默认是false
        $a=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"100");
        echo array_search("red",$a);//a
        var_dump (array_search("yellow",$a));//bool(false)
        echo array_search(100,$a);//d----数字100,返回了d
        var_dump (array_search(100,$a,true));//bool(false)-----数字100和数字中的字符串100不一致,返回false
    ?>

    五、数组的相关算法

    ①排序算法

    • 冒泡排序法
    <?php
        $arr=[15,25,10,2,8,5];
        $len=count($arr);
        //外层循环控制轮数
        for($j=1;$j<$len;$j++){
            for($i=0;$i<$len-$j;$i++){
                //内层循环比较并调换位置
                if($arr[$i]>$arr[$i+1]){
                    //$arr[$i]表示当前元素
                    //$arr[$i+1]表示当前元素的下一个元素
                    $temp=$arr[$i];
                    $arr[$i]=$arr[$i+1];
                    $arr[$i+1]=$temp;
                }
            }
        }
        print_r($arr);//Array ( [0] => 2 [1] => 5 [2] => 8 [3] => 10 [4] => 15 [5] => 25 )
    ?>
    • 插入排序法
    <?php
        $arr=[15,25,10,2,8,5];
        //外层循环控制每次拿出第几个数进行比较
        for($j=1;$j<count($arr);$j++){
            $target=$arr[$j];
            //内层循环控制数组的比较和调换位置
            for($i=$j-1;$i>=0;$i--){
                if($arr[$i]>$arr[$i+1]){
                    $arr[$i+1]=$arr[$i];
                    $arr[$i]=$target;
                }
            }
        }
        echo '<pre>';
        print_r($arr);//Array ( [0] => 2 [1] => 5 [2] => 8 [3] => 10 [4] => 15 [5] => 25 )
    ?>

    ②查找算法

    • 顺序查找法
    <?php
        $arr=[15,25,10,2,8,5];
        $search=10;
        function showInfo($arr,$search){
            $len=count($arr);
            for($i=0;$i<$len;$i++){
                if($search==$arr[$i]){
                    return $i;
                }
            }
        }
        echo showInfo($arr,$search);//2
    ?>
    • 二分查找法(注意:此方法只适应于按数字大小顺序排列的数组)
    <?php
        function binary($arr,$search){
            $l=0;              
            $r=count($arr)-1;
            while($l<=$r){
                $m=ceil(($l+$r)/2);
                if($arr[$m]==$search){
                    return $m;
                }else if($search>$arr[$m]){
                    $l=$m+1;
                }else if($search<$arr[$m]){
                    $r=$m-1;                                 
                }
            }
            return false;
        }
        $arr=[3,10,13,18,20,45,60,77,99,100];
        $search=60;
        echo binary($arr,$search);//6
    ?>
  • 相关阅读:
    CSU 1333 Funny Car Racing
    FZU 2195 检查站点
    FZU 2193 So Hard
    ZOJ 1655 FZU 1125 Transport Goods
    zoj 2750 Idiomatic Phrases Game
    hdu 1874 畅通工程续
    hdu 2489 Minimal Ratio Tree
    hdu 3398 String
    洛谷 P2158 [SDOI2008]仪仗队 解题报告
    POJ 1958 Strange Towers of Hanoi 解题报告
  • 原文地址:https://www.cnblogs.com/EricZLin/p/9170814.html
Copyright © 2011-2022 走看看