• 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
    ?>
  • 相关阅读:
    以太坊公开拍卖智能合约案例
    部署智能合约
    ERC20 Token
    查看crontab运行状态
    php把excel数值格式转成日期格式
    PHP识别中文编码并自动转换为UTF-8
    python中文件内容替换
    mysqldump备份指定的数据
    linux设置服务器时间
    git常用命令
  • 原文地址:https://www.cnblogs.com/EricZLin/p/9170814.html
Copyright © 2020-2023  润新知