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
?>
原文地址:https://www.cnblogs.com/EricZLin/p/9170814.html