zoukankan      html  css  js  c++  java
  • PHP基础入门(四)---PHP数组实用基础知识

    PHP数组

           数组是特殊的变量,它可以同时保存一个以上的值。

       ***关键词:数组基础、数组遍历、超全局数组、数组功能、数组函数。

    下面来和大家分享一下有关PHP的数组基础知识,希望对你PHP的学习有所帮助~

    一、PHP数组基础部分

    PHP数组的分类


    按照下标的不同,PHP数组分为关联数组和索引数组;
    索引数组:下标从0开始,依次增长
    关联数组:下标为字符串格式,每个下标字符串与数组的值一一关联对应(类似对象的键值对)

    代码演示:

    1 $arr1 = array(1,2,3,4,5,6,7);//索引数组
    2 var_dump($arr1);
    3    
    4 $arr2 = array("one"=>1,"two"=>2,"three"=>3);//关联数组
    5 var_dump($arr2);
    6    
    7 $arr3 = array(1,"one"=>2,3,5=>4,5,6,"10.0"=>7,"08"=>8,"08"=>10,"hahah"=>9);
    8 var_dump($arr3);

    关于关联数组和索引数组


    1、数组中,可以同时存在索引数组与关联数组。
    array(1,2,3,"one"=>4);

    2、数组中,所有的索引数组,如果不加指定,会去掉关联项,默认增长(即,关联数组不占索引位);
    array(1,2,"one"=>3,4,5);//1,2,4,5的索引--->0/1/2/3

    3、如果,关联数组的key,是纯十进制整数字符串,
    则会将此数字转为索引数组的索引值;("10.0"/"08"等格式,仍然是关联数组,不转为索引)
    array(1,2,"one"=>3,"9"=>4,"010"=>5);//1,2,4的索引--->0/1/9

    4、如果,手动指定关联数组的key,索引数组的下标,如果与前面已有的key或下标重复,则后制定的值会覆盖之前的值;
    array(1,"one"=>2,0=>5,"one"=>6);--->打印数组,0=>5,"one"=>6

    5、如果手动指定索引数组下标,则后续自增长下标,会按照之前下标最大值,依次增长。
    array(1,2,7=>3,4);--->1,2,3,4的下标--->0/1/7/8

    数组的声明方式


    1、直接赋值声明
    $arr[] = 1;
    $arr[] = 1;
    $arr[] = 1;
    $arr[] = 1;
    $arr[] = 1;
    var_dump($arr);

    2、[]字面量声明(PHP5.4版本之后能用)
    $arr = [1,2,3,4,"one"=>5,6];
    var_dump($arr);

    3、Array()声明 没有new关键字
    $arr = array(1,2,3,4,5);
    var_dump($arr);

    数组元素的读取


    PHP中,数组支持[]和{}读取下标。


    多维数组

    ①数组的一个值,依然是一个数组,我们称这种数组为多维数组;
    ②多维数组,不要求所有的项都是数组,可以是数组与普通值的混合;
    ③多维数组,也不要求每个子数组的个数限制,可以是任意的长度。

    使用多维数组,一定要注意,数组中分隔用逗号!
    原则上,多维数组一般不超过3层使用!

    三维数组代码演示如下:

     1 $H51701 = array(
     2 "group1"=>array(
     3 array("name"=>"张三","age"=>14,"sex"=>"男"),
     4 array("name"=>"李四","age"=>15,"sex"=>"男"),
     5 array("name"=>"王二","age"=>13,"sex"=>"男")
     6 ),
     7 "group2"=>array(
     8 array("name"=>"张三","age"=>15,"sex"=>"男"),
     9 array("name"=>"李四","age"=>15,"sex"=>"男"),
    10 array("name"=>"王二","age"=>14,"sex"=>"男")
    11 ),
    12 "group3"=>array(
    13 array("name"=>"张三","age"=>14,"sex"=>"男"),
    14 array("name"=>"李四","age"=>18,"sex"=>"男"),
    15 array("name"=>"王二","age"=>24,"sex"=>"男")
    16 ),
    17 );
    18 var_dump($H51701);

     

    二、数组遍历

    1、使用for循环遍历数组
    count($arr);用于统计数组元素的个数

    for循环只能用于遍历,纯索引数组!
    如果存在关联数组,count统计时会统计两种数组的总个数,使用for循环遍历混合数组,导致数组越界!

    代码如下:

    1 $arr = array(1,2,3,"one"=>4,5,6,7);
    2 $num = count($arr);
    3 echo"数组元素的个数{$num}<br/>";
    4 for($i=0;$i<$num;$i++){
    5 echo "{$i}==>{$arr[$i]}<br/>";
    6 }

    2、forEach循环遍历数组
    foreach可以遍历任何类型的数组!

    代码如下:

    1 $arr = array(1,2,3,"one"=>4,5,6,7);
    2 foreach($arr as $key=>$item){
    3 echo "{$key}==>{$item}<br/>";
    4 }

    下面我们来做一个数组遍历的小练习~看代码~

     1 $arr = array(
     2 "group1"=>array(
     3 array("name"=>"张三","age"=>14,"sex"=>"男"),
     4 array("name"=>"李四","age"=>12,"sex"=>"男"),
     5 array("name"=>"王二","age"=>18,"sex"=>"男")
     6 ),
     7 "group2"=>array(
     8 array("name"=>"张三","age"=>14,"sex"=>"男"),
     9 array("name"=>"李四","age"=>16,"sex"=>"男"),
    10 array("name"=>"王二","age"=>19,"sex"=>"男")
    11 ),
    12 "group3"=>array(
    13 array("name"=>"张三","age"=>14,"sex"=>"男"),
    14 array("name"=>"李四","age"=>12,"sex"=>"男"),
    15 array("name"=>"王二","age"=>13,"sex"=>"男")
    16 ),
    17 );
    18 
    19 foreach($arr as $key=>$value){
    20 echo "{$key}<br/>"; 
    21 foreach($value as $key1=>$value1){
    22 echo "第".($key1+1)."个同学<br/>";
    23 foreach($value1 as $key2=>$value2){
    24 echo "{$key2}==>{$value2}<br/>";
    25 }
    26 echo"<br/>";
    27 }
    28 echo"----------------------<br/>";
    29 }

    3、使用list(),each(),while()遍历数组
    list():用于将数组的每一个值,赋值给list函数的每一个参数。(list函数的参数,必须<=数组的元素个数);
    eg:list($a,$b,$c) = [1,2,3]; --->$a=1; $b=2; $c=3;

    注意
    ①list()在解析数组时,只解析索引数组;
    ②list可以通过空参数,选择性的解析数组的值;
    list($a,,$b)=[1,2,3];-->$a=1;$b=3;

    each():用于返回数组当前指针所在位的键值对!并将指针后移一位;
    返回值:如果指针有下一位,返回一个数组。包含一个索引数组(0-键,1-值)和一个关联数组("key"-键,"value"-值);
    如果指针没有下一位,返回false。

    4、使用list()/each()/while()配合遍历数组※※※

    1 while(list($key,$value) = each($arr)){
    2 echo "{$key}-->{$value}<br>";
    3 }
    4 reset($arr);

    !!!数组使用each()遍历完一遍后,指针使用处于最后一位的下一位,即再用each(),始终返回false;
    如果还需使用,需用reset($arr);函数,重置数组指针。

    $arr = [1,2,3,4];
    list($a,$b,$c,$d) = $arr;
    echo "a-->{$a}<br/>";
    echo "b-->{$b}<br/>";
    echo "c-->{$c}<br/>";
    echo "d-->{$d}<br/>";

    while($a = each($arr))

    ①each($arr)返回数组或false;
    ②把数组或false赋值给$a;
    ③while判断$a如果是数组,继续执行下一位;
    如果$a是false,终止循环。

     1 while($a = each($arr)){
     2 echo "{$a[0]}-->{$a[1]}<br>";
     3 echo "{$a['key']}-->{$a['value']}<br>";
     4 }
     5 
     6 while(true){
     7 $a = each($arr);
     8 if($a){
     9 echo "{$a[0]}-->{$a[1]}<br>";
    10 echo "{$a['key']}-->{$a['value']}<br>";
    11 }else{
    12 break;
    13 }
    14 }
    15 
    16 while(list($key,$value) = each($arr)){
    17 echo "{$key}-->{$value}<br>";
    18 } 
    19 reset($arr);

    5、使用数组指针遍历数组

    ①next:将数组指针,后移一位,并返回后一位的值,没有返回false
    ②prev:将数组指针,前移一位,并返回前一位的值,没有返回false
    ③end:将数组指针,移至最后一位,返回最后一位的值,空数组返回false
    ④reset:将数组指针,恢复到第一位,并返回第一位的值,空数组返回false
    ⑤key:返回当前指针所在位的键;
    ⑥current:返回当前指针所在位的键;

     1 $arr = [1,2,3,4,"one"=>5];
     2 while(true){
     3 echo key($arr);
     4 echo "--";
     5 echo current($arr);
     6 echo "<br>";
     7 if(!next($arr)){
     8 break;
     9 }
    10 }
    11 reset($arr);
    12 do{
    13 echo key($arr);
    14 echo "--";
    15 echo current($arr);
    16 echo "<br>";
    17 }while(next($arr));
    18 reset($arr);
    三、超全局数组


    超全局数组,超全局变量,预定义数组,预定义变量——说的都是它。

    PHP给我们提供了一组包含强大功能的超全局数组,可以在任何地方,任何作用域不需声明,直接使用!不受任何作用域限制。

    PHP超全局数组

           1、服务器变量: $_SERVER
      2、环境变量:$_ENV
      3、HTTP GET变量:$_GET
      4、HHTP POST变量:$_POST
      5、request变量:$_REQUEST
      6、HTTP文件上传变量:$_FILES
      7、HTTP Cookies:$_COOKIE
      8、Session变量:$_SESSION
      9、Global变量:$GLOBALS

    1、服务器变量: $_SERVER
    var_dump($_SERVER);
    echo ($_SERVER{'HTTP_USER_AGENT'});

    2、环境变量:$_ENV
    将系统环境变量,转变为PHP中的数组,就是$_ENV;

    PHP默认是关闭此全局数组的。如果需要使用,
    需修改php.ini文件中的variables_order = "GPSC",
    改为variables_order = "EGPSC";

    但是,修改后会有系统性能损失,港方并不推荐使用。
    可以使用getenv()函数取代全局变量,取出每个系统环境变量的值。

    phpinof();函数,包含了有关PHP的各种信息,其实environment板块就是系统环境的变量,可以使用getevn()函数取出其中的值;

    3、HTTP GET变量:$_GET
    获取前台通过get方式提交的数据

    1 if(isset($_GET["sybmit"]&&isset($_GET["pwd"]))){
    2 if($_GET["username"]=="111"&&$_GET["pwd"]=="111"){
    3 echo "Get登录成功!";
    4 }else{
    5 echo "Get登录失败!";
    6 }
    7 }

    4、HHTP POST变量:$_POST
    获取前台通过post方式提交的数据

    1 if(isset($_POST["sybmit"])){
    2 if($_POST["username"]=="111"&&$_POST["pwd"]=="111"){
    3 echo "POST登录成功!";
    4 }else{
    5 echo "POST登录失败!";
    6 }
    7 }

    5、request变量:$_REQUEST
    包含了$_GET,$_POST和$_COOKIE的数组
    由于request同时包含get和post,可能导致get与post的键冲突,并且频率也不高。所以,并不使用request。
    var_dump($_REQUEST);

    6、HTTP文件上传变量:$_FILES
    通过HTTP POST方式上传到当前脚本的项目的数组。
    var_dump($_FILES);

    7、HTTP Cookies:$_COOKIE
    取到页面中的Cookie信息
    1 setcookie("cookie","haha");

    2 $_COOKIE["hehe"] = "hehe";

    3 var_dump($_COOKIE); 


    8、Session变量:$_SESSION
    取到保存在Session中的信息。
    session_start();
    $_SESSION["haha"] = "haha";
    var_dump($_SESSION);*/

    9、Global变量:$GLOBALS
    $GLOBALS包含了上述8个全局数组,可以通过$GLOBALS["_SERVER"]取到$_SERVER
    还可以通过给$GLOBALS数组追加下标。创建全局变量,可以在函数里函数外随意访问:$GLOBALS["name"] = "zhangsan";
    var_dump($GLOBALS["_SERVER"]);

    四、数组功能

     

    1、返回数组所有的值,返回数组
    var_dump(array_values($arr));

    2、返回数组所有的键,返回数组
    var_dump(array_keys($arr));

    3、检测数组中是否包含某个值。返回真、假
    参数:需要查询的值,数组,true(===)/false(===) 默认
    var_dump(in_array("8",$arr,true));

    4、交换数组中的键和值,返回新数组
    var_dump(array_flip("8",$arr));

    5、反转数组,返回新数组
    参数:需要反转的数组
    true:保留原有索引数组的下标与值的匹配。
    false:只反转值,键不反转,默认
    无论true/false,都不会影响关联数组,关联数组键,值永远是一对。
    var_dump(array_reverse($arr,true));

    6、统计数组元素个数
    count($arr);

    7、统计数组中,所有值出现的次数,返回一个新数组
    新数组格式:键-->原数组的值(去重后的值)
    值-->原数组对应的值出现的次数。
    var_dump(array_count_values($arr));

    8、移出数组中重复的值!
    var_dump(array_unique($arr));

    9、过滤数组中的每一个值:
    ①不传回调函数:过滤掉所有空值(0/""/null/false/"0"/[])
    ②传回调函数:需要给回调函数传递一个参数,判断参数是否符合要求,如果符合,return true;否则,return false。

    1 var_dump(array_filter($arr,function($num){
    2 if($num>4){
    3 return true;
    4 }else{
    5 return false;
    6 }
    7 }));


    通过回调函数,对数组的每一个值,进行处理操作。(直接修改原数组,并返回bool类型的是否成功)
    执行时,会给回调函数传递两个参数,分别是数组的value,key,然后可以在毁掉函数中,对值和键进行处理。
    但是,牵扯到修改值的时候,必须要传递地址&!!!!
    $fruits = array("d" => "lemon","a" => "orange","b" => "banana","c" => "apple");

    1 var_dump(array_walk($fruits,function(&$item,$key){
    2 echo "{$key}-->{$item}<br>";
    3 $item .= $key;
    4 }));
    5 var_dump($fruits);

    将数组的每个值交由回调函数进行映射处理
    array_map():第一个参数,是一个回调函数。第二个参数起,是>=1个数组。
    有几个数组,可以给回调函数传几个参数,,表示每个数组的一个value;
    可以对value进行处理,处理完以后通过return返回,那么新数组的对应的值就是你return回去的值。

    【array_map与array_walk的异同】
    相同点都能遍历数组,通过回调函数,重新处理数组的每一个值;
    不同点
    ①walk只能传一个数组,回调函数接收这个数组的值和键;
    map可以传多个数组,回调函数接收每个数组的值;
    ②walk直接修改原数组,而map不修改原数组,将新数组返回;
    ③walk给回调函数传递一个其余参数,map只能传数组的值;
    ④处理方式上,walk如果需要改掉原数组的值,需在回调函数中传递地址,直接修改变量的值;
    而map,是通过将新的值,用return返回,即可修改新数组的值。
    $a = [1,2,3,4,5];
    $b = [1,2,3,4,5];

    1 var_dump(array_walk($fruits,function(&$item,$key){
    2 echo "{$key}-->{$item}<br>";
    3 $item .= $key;
    4 }));
    5 var_dump($fruits);

     

    五、数组函数

    sort -- 对数组排序(升序)

    var_dump(sort($arr));


    rsort--对数组逆向排序(降序)


    usort--使用用户自定义的比较函数对数组中的值进行排序


    asort--对数组进行排序并保持索引关系(关联数组排序)


    arsort--对数组进行逆向排序并保持索引关系


    uasort--用户自定义的比较函数对数组进行排序并保持索引关联


    ksort--对数组按照键名排序


    krsort--对数组按照键名逆向排序


    uksort--使用用户自定义的比较函数对数组中的键名进行排序


    natsort--用“自然排序”算法对数组排序


    natcasesort--用“自然排序”算法对数组不区分大小写字母排序


    array_multisort -- 对多个数组或多维数组进行排序
    第一个参数:第一个数组,必选
    第二个参数:SORT_DESC;SORT_ASC(升序降序);
    第三个参数:SORT_STRING/SORT_NUMERIC(按照字符串还是数字排序)
    再之后是多个数组
    排序规则:先排第一个数组,后面的数组会根据和第一个数组的对应关系,一列一列的排序;

    如果多个数组多个数组排序,排序的数组长度要相等,否则报警告;

    array_slice($array, $offset)
    第一个参数:数组,必须;
    第二个参数:从第几位开始截,负数表示从右往左数(按照数组的顺序ps:包括关联数组,而非下标)
    第三个参数:截取的长度,可选,默认截取到最后
    第四个参数:bool类型的参数,默认为false,索引重新排序,true保持索引关联
    $arr1 = array_slice($arr, 2,5,TRUE);


    array_splice($offset)
    返回值:数组(被删掉的部分)
    参数:
    1、数组的地址,会修改原数组
    2、从第几位开始删
    3、删除的长度,不填默认到结尾
    4、不填,默认为删除,填,用填的部分替换删掉的部分;
    $arr1 = array_splice($arr, 2,5,[1,2,3,4]);


    array_combine($keys, $values);创建一个数组,用一个数组的值作为键名,另一个数组的值作为值;
    array_combine($keys'作为键的数组', $values'作为值的数组');
    两个数组的长度必须一致,否则报警告


    array_merge($array1);合并一个或多个数组
    合并多个数组,将后面的数组拼接在前面数组的后面
    如果多个数组中存在多个同名的关联键,则后面的会覆盖前面的


    array_intersect($array1, $array2);两个数组取交集
    多个数组取交集,结果会保留第一个数组的键值关联匹配


    array_diff($array1, $array2);多个数组取差集;
    取出多个数组中,在第一个数组中包含,但是在其他数组中不包含的值,保留第一个数组的键值关联;


    array_pop();

    删除数组最后一个值;返回删除的值;


    array_push($var);
    数组的最后插入一个或多个值;返回处理之后元素的个数


    array_shift();
    删除数组第一个值;返回删除的值;


    array_unshift($var);
    数组的开头插入一个或多个值;返回处理之后元素的个数


    array_rand($input);随机抽取数组中的一个到多个键名!第二个参数为空,表示抽一个,传入数字n表示抽n个


    shuffle();将函数打乱重新排序

    好啦~~~今天的内容先分享到这里,小女子小菜鸟一只,还请各位园友多多指教·喜欢就点个赞吧~感谢支持!

    ..。..。..。..。..。..。..。..。..。END..。..。..。..。..。..。..。..。..。

    ..。..。..。..。..。..。希望可以帮到你哟..。..。..。..。..。..。


    作者:夕照希望
    出处:http://www.cnblogs.com/hope666/  
    今日事,今日毕!我爱敲代码,代码使我快乐~
  • 相关阅读:
    noip退役赛
    noip模拟赛
    集合划分状压dp
    bzoj 3730 震波
    noip前打板子 qwq
    noip模拟赛
    HAOI2015 树上染色
    一个菜鸡出的模拟赛!
    ioinc
    centos=>gsutil,iptables
  • 原文地址:https://www.cnblogs.com/hope666/p/7073094.html
Copyright © 2011-2022 走看看