设为首页 收藏本站
查看: 966|回复: 0

[经验分享] php学习_第7章_PHP数组及数据结构

[复制链接]

尚未签到

发表于 2018-12-20 12:25:25 | 显示全部楼层 |阅读模式
  --php数组不限制长度不限制数据类型
  这个特性和c语言堆比较像,因此数组可以很方便构建c语言中堆可以构建的数据结构(链表,队列,栈,集合)。
  --数组的结构:数组由元素组成,每个元素由下标(或者叫键)组成。
  数组的下标只能是整数字符串
  --索引数组与关联数组


  • 索引数组:下标是顺序整数的数组。
  • 关联数组:下标是字符串的数组。
  --数组的声明方式


  • (适用于分多次声明数组元素,比如在for循环中)直接给数组元素赋值,就会自动生成数组。比如$usr[0]=10,$usr[1]="zhangsan",$usr[2]="nan",虽然就像其他语言给已有的数组元素赋值那样,在php中会自动创建一个数组,在这里就创建了$usr[]数组,它目前有3个元素,后面还可以再加(元素个数不限),里面的类型也不限。

    • 如果数组下标不给出,将被认为是索引数组,下标从0开始。
    • 如果连续给出几个整数下标,下一个未给出的将从上面最大的整数开始。
    • 如果后面出现前面的下标,则被认为前面元素的重新赋值。
    • 混合声明时,索引和关联不互相影响(关联不会影响索引的声明)

  • 用array()函数创建,适用于一次性声明数组所有元素

    • 默认是索引数组。
    • 如果要为关联数组和索引数组指定下标,使用 键=>值,比如$usr=array("id"=>1,"name"=>"zhangsan",100=>10);
    • 如何声明多维数组:各元素(可能本身也是数组)之间用","分隔。比如array(array(),array(),"zhangsan");

  • 用其他函数创建。(比如file()函数就会返回一个数组)
  --数组的遍历


  • 使用for()语句,循环遍历数组(不常用,因为它有限制,要求数组必须是索引数组,而且下标是连续的)。
  • 使用foreach()语句,循环遍历数组。(最常用方式)

    • 使用格式:foreach(数组名 as 变量){ 循环体 }//变量是自定义的
    • 注意事项:

      • foreach循环次数由数组元素个数自动决定。
      • 每一次循环都将数组元素赋给变量。

    • 如果需要下标的值:foreach(数组名 as 下标变量=>值变量)//下标变量,值变量都是自定义的

  • 使用while() list() each()语句,循环遍历数组。(list()多用在分隔字符串形成的数组中

    • each函数(把数组的当前参数的键和值组成一个数组返回)

      • 需要一个数组作为参数。
      • 返回来也是一个数组,返回的数组包含4个元素,下标是0,"key",1,"value"。

        •     0,"key"是(each函数的参数数组)数组当前参数
        •     1,"value"是(each函数的参数数组)数组当前参数

      • 默认的当前元素就是第一个元素。
      • 每执行一次,当前元素就往后移动一个。执行到数组末尾,函数返回false。

    • list函数(将数组元素转换为变量)

      • 格式:list($a,$b)=array(1,2);
      • 需要将一个数组赋值给这个函数(c语言中没有出现过将数组赋给函数的)
      • 数组元素的个数要与函数参数个数相同。
      • 数组的各个元素被赋值给函数的各个参数,list()将参数转换为变量供后面使用。
      • 只接受索引数组。按索引下标的顺序赋值给各个参数(下标为0的赋值给第1个参数)


  --数组的内部指针函数(操作数组的内部指针)


  • reset(数组名);//复位数组指针
  • end(数组名);//指向最后一个元素
  • next(数组名);//返回数组内部指针指向的下一个单元的值,或当没有更多单元时返回 FALSE
  • prev(数组名);//返回数组内部指针指向的前一个单元的值,或当没有更多单元时返回 FALSE
  • current(数组名);//返回当前元素的值
  • key(数组名);//返回当前元素的键
  --超全局数组(自动全局变量)


  • 包含了来自web服务器,客户端,运行环境和用户输入的数据。
  • 全局范围生效,可以直接使用这些数组。
  • 用户不能自定义这些数组,但这些数组的操作方式与我们自定义数组的操作方式一样。
  • 在任何函数中都可以直接使用(普通全局变量需要先用global声明)
  • 存放在超全局数组里的变量(比如GET传的变量),可以直接当做变量来用(尽量不要这样使用,因为如果php.ini中register_globals如果选为off就不能这么用的,尽管默认虽然为On)。
  • 常见的超全局数组:

    • $_GET //经URL请求,提交至服务器脚本的变量。所有链接后面的参数默认都是以GET请求的方式传至服务器脚本。
    • $_POST //经HTTP POST方法,提交至服务器脚本的变量。POST方法比GET安全,POST提交的数据封装在HTTP数据体中(GET方法的数据放在HTTP头中),如果上传文件的话也只能用POST
    • $_REQUEST //经GET,POST,COOKIE机制提交至脚本的变量,因此这个数组不值得信任,尽量不要使用。
    • $_FILES
    • $_COOKIE
    • $_SESSION
    • $_ENV //执行环境提交至脚本
    • $_SERVER //由web服务器设定或和当前脚本的执行环境相关联
    • $GLOBALS //当前有效的所有全局变量,元素键名为变量名

  --$GLOBALS用法:
  因为$GLOBALS里面有所有全局变量,而且GLOBALS本身是超全局变量(可以在任何函数中使用),那么这些全局变量就可以通过GLOBALS在任意函数中使用,而不必通过global关键字声明了。比如$a=3;function demo(){echo $GLOBALS["a"];}
  --和数组 键/值 操作有关的函数


  • array array_values(数组名) //返回数组的所有值,也是个数组,是个索引数组。所以它可以把任意数组都变为索引数组,操作数必须是索引数组的函数可以配合它(比如list)使用。
  • array array_keys(数组名,[元素值[,true/false]] ) //返回键,也是个数组,默认返回所有键;如果指定了元素值,则返回与元素值相等的特定键;最后1个参数“真/假”规定了是否需要类型也相等,默认为false(不需要)
  • bool in_array(mixed 值,数组名[,true/false]) //判断值是否在数组中,最后1个参数“真/假”规定了是否需要类型也相等,默认为false(不需要)
  • bool array_key_exists(键,数组名) //判断键是否在数组中
  • array array_flip(数组名) //交换数组中所有键与值,如果交换后出现相同的键,则后面键的值覆盖前面的
  • array array_reverse ( array array [, bool preserve_keys]  )  
    //返回一个单元顺序相反的数组(注意:是返回新数组,而不是修改老数组),如果preserve_keys 为"TRUE",则逆序后的数组仍保持原来的键值,比如原来数组索引为0-9,preserve_keys为TRUE时,逆序后数组索引是9-0.
      


  --统计数组元素个数和唯一性的函数


  • int count(数组名[,0/1]),它的别名函数int>
  • array array_count_values(数组名) //返回数组各个值出现的次数,也是一个数组,返回的数组用原数组的值作为键,用该值出现的次数作为值。对输入数组的要求是,不能是嵌套数组。
  • array array_unique(数组名) //移除数组中重复的值,返回也是个数组,如果有重复的只留第1个
  --使用回调函数处理数组的函数


  • array array_filter        ( array $input       [, callback $callback      ] ) //使用回调函数过滤数组中的元素。依次将数组中的每个值传递到 回调函数。如果回调函数返回  TRUE,则  数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。
  • bool array_walk     ( array &$array    , callback $funcname    [, mixed $userdata   ] )  //对数组中的每个成员应用回调函数,回调函数至少接收2个参数,第1个是数组元素的值,第2个是数组元素的键,如果array_walk还有参数3,那么回调函数要有第3个参数。如果要改变数组元素的值,回调函数的第1个参数要设为引用。举例:
  



  

  上面程序将输出:
  


  • Before ...:
  • d. lemon
  • a. orange
  • b. banana
  • c. apple
  • ... and after:
  • d. fruit: lemon
  • a. fruit: orange
  • b. fruit: banana
  • c. fruit: apple
  


  • array array_map(callback callback, array arr1 [, array ...] ) //将回调函数作用在各数组对应(排序相同)的各个元素上,回调返回值就是返回数组的元素。回调函数就受的参数个数应该等于array_map接受的数组个数。
  --数组的排序(简单的排序,根据进行排序,将丢失键值对应关系)


  • bool sort ( array &array [, int sort_flags] ) //对数组进行从小到大的排序,注意:参数&array是引用,函数不仅仅是排序,它将赋予数组新的键名。sort_flags用于标识是按数字排序,还是按字符串排序。
  • bool rsort ( array &array [, int sort_flags] ) //对数组进行从大到小的排序,注意:参数&array是引用,函数不仅仅是排序,它将赋予数组新的键名。sort_flags用于标识是按数字排序,还是按字符串排序。
  --数组的排序(根据对数组进行排序)


  • bool ksort ( array &array [, int sort_flags] ) //对数组键名进行从小到大的排序,注意:参数&array是引用,函数将保留键与值的对应关系。sort_flags用于标识是按数字排序,还是按字符串排序。
  • bool krsort ( array &array [, int sort_flags] ) //对数组键名进行从大到小的排序,注意:参数&array是引用,函数将保留键与值的对应关系。sort_flags用于标识是按数字排序,还是按字符串排序。
  --数组的排序(根据进行排序,保留键值对应关系)


  • bool asort ( array &array [, int sort_flags] ) //对数组值进行从小到大的排序,注意:参数&array是引用,函数将保留键与值的对应关系。sort_flags用于标识是按数字排序,还是按字符串排序。
  • bool arsort ( array &array [, int sort_flags] ) //对数组值进行从大到小的排序,注意:参数&array是引用,函数将保留键与值的对应关系。sort_flags用于标识是按数字排序,还是按字符串排序。
  --数组的排序(根据自然数进行排序)
  自然数:不是按字母顺序,而是按人的识别顺序排序字符串,比如"file2"按自然数就拍在"file11"的前面。是人们通常对字母-数字字符串进行排序的方法。


  • bool natsort(array &array) //按自然数进行排序,保持键值对应关系。
  • bool natcasesort(array &array) ////按自然数进行排序,保持键/值对应关系。不区分大小写。
  --数组的排序(根据用户自定义规则进行排序)


  • bool usort ( array &array, callback cmp_function  ) //用户自定义的函数决定了数组里元素间按值比较的比较规则,比较函数cmp_function必须在第一个参数被认为小于,等于或大于第二个参数时分别返回一个小于0,等于0或大于0的整数。得到的数组将丢失键/值对应关系。
  • bool uasort ( array &array, callback cmp_function  ) //用户自定义规则排序,得到数组将保留键/值对应关系。
  • bool uksort ( array &array, callback cmp_function  ) //用户自定义函数决定了数组里元素间按键比较的比较规则,得到数组将保留键/值对应关系。
  --数组的拆分、合并、分解、接合


  • array array_slice ( array array, int offset [, int  length [, bool preserve_keys]] )  

      


    • array_slice() 返回根据 offset  和 length 参数所指定的 array  数组中的一段序列。
    • 如果 offset 非负,则序列将从 array 中的此偏移量开始。如果 offset  为负,则序列将从 array 中距离末端这么远的地方开始。
    • 如果给出了 length 并且为正,则序列中将具有这么多的单元。如果给出了 length 并且为负,则序列将终止在距离数组末端这么远的地方。如果省略,则序列将从 offset 开始一直到 array 的末端。
    • 注意 array_slice() 默认将重置数组的键。自 PHP 5.0.2 起,可以通过将 preserve_keys 设为 TRUE  来改变此行为。

  • array array_splice ( array &input, int offset [, int  length [, array replacement]] )  


    • array_splice() 把 input  数组中由 offset 和 length  指定的单元去掉,如果提供了 replacement 参数,则用 replacement 数组中的单元取代。返回一个包含有被移除单元的数组。注意 input 中的数字键名不被保留。
    • 如果 offset 为正,则从 input 数组中该值指定的偏移量开始移除。如果 offset 为负,则从 input  末尾倒数该值指定的偏移量开始移除。
    • 如果省略 length,则移除数组中从 offset 到结尾的所有部分。如果指定了 length  并且为正值,则移除这么多单元。如果指定了 length 并且为负值,则移除从 offset 到数组末尾倒数 length  为止中间所有的单元。小窍门:当给出了 replacement 时要移除从 offset 到数组末尾所有单元时,用 count($input)  作为 length。
    • 如果给出了 replacement 数组,则被移除的单元被此数组中的单元替代。如果 offset 和 length  的组合结果是不会移除任何值,则 replacement 数组中的单元将被插入到 offset 指定的位置。注意替换数组中的键名不保留。如果用来替换的值只是一个单元,那么不需要给它加上 array(),除非该单元本身就是一个数组。

  • array array_combine ( array keys, array values )

    •   返回一个 array,用来自  keys 数组的值作为键名,来自 values 数组的值作为相应的值。

    • 如果两个数组的单元数不同或者数组为空时返回 FALSE

  • array array_merge ( array array1 [, array array2 [,  array ...]])

    • array_merge()  将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。
    • 如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。
    • 如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引。

  • array array_intersect ( array array1, array array2 [,  array ...] )  


    • array_intersect() 返回一个数组,该数组包含了所有在 array1 中也同时出现在所有其它参数数组中的值。注意键名保留不变。

  • array array_diff ( array array1, array array2 [, array  ...] )  


    • array_diff() 返回一个数组,该数组包括了所有在 array1 中但是不在任何其它参数数组中的值。注意键名保留不变。

  --使用数组实现堆栈

栈结构:栈底--->  [0]=>a0,[1]=>a1,[2]=>a2,[3]=>a3    [0]=>a0,[1]=>a1,[2]=>a2,[3]=>a3

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-653600-1-1.html 上篇帖子: php webp 下篇帖子: 不重新编译PHP为php增加openssl.so模块
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表