黑马程序员技术交流社区

标题: 【上海校区】PHP 数组浅析 [打印本页]

作者: 不二晨    时间: 2018-11-12 09:43
标题: 【上海校区】PHP 数组浅析
一、概要二、简单介绍及基本使用<?php  $arr = array('a' => 1, 'z' => 100); ><?php $arr = [1, 2, 3, 4]; $arr = ['a' => 1, 'z' => 100]; <?php $arr = [1, 'hello' => '11', 'arr' => [1, 'a'=>'b']];<?php $arr = [1, 'hello' => '11', 'arr' => [1, 'a'=>'b']];var_dump($arr[0]); // 1var_dump($arr['arr']); // [1, 'a' => 'b']<?php $arr = [1, 'hello' => '11', 'arr' => [1, 'a'=>'b']];$arr[0] = 'test';var_dump($arr);  <?php$arr = [1, 2, 3, 4]; //追加元素$arr[] = 'a';// 添加 key, value$arr['test'] = 'b';<?php$arr = [1, 'hello' => '11', 'arr' => [1, 'a'=>'b']];unset($arr['hello']);var_dump($arr['hello']);  // null<?php $arr = [1, 'hello' => '11', 'arr' => [1, 'a'=>'b']];foreach($arr as $key => $value) {    var_dump($key . ' => ' . $value);}
更多数组遍历的方法请参考php-数组遍历
- 数组之间的比较,数组无法比较大小, 但可以根据一定条件判断是否相等
<?php // $a == $b 相等 如果 $a$b 具有相同的键/值对则为 TRUE。// $a === $b 全等 如果 $a$b 具有相同的键/值对并且顺序和类型都相同则为 TRUE。$a = [1, 2];$b = ['1' => 2, 0 => 1];var_dump($a == $b); // truevar_dump($a === $b); // false
三、实用的数组工具函数
掌握了数组的基本操作(定义使用,增删改查, 遍历) 之后,你就可以在开发中使用数组, 但只有这些操作是远远不够的,为了满足复杂多变的开发场景对数组操作的需求,PHP 提供了功能强大的一套 Array 操作的函数
- 获取数组长度
<?php $arr = [1, 2, 3];var_dump(count($arr)); // 3<?php $arr = [1, 2, 3];$notArr = '111';var_dump(is_array($arr)); // truevar_dump(is_array($notArr)); // false// 判断key 是否在数组中$arr = ['a' => 2, 4];var_dump(isset($arr['a'])); // true  var_dump(array_key_exists('a', $arr)); // true// 判断 value 是否在数组中in_array(5, $arr);  // false<?php $arr = ['a' => 2, 4];$keys = array_keys($arr); // ['a', 1]<?php $arr = ['a' => 2, 4];$values = array_values($arr); // [2, 4]<?php$arr = [1, 3, 2, 'a' => 1, 'b' => 2];var_dump(array_count_values($arr));/*array(3) {  [1]=>  int(2)  [3]=>  int(1)  [2]=>  int(2)}*/
数组与数组之间的操作:数组可以看做一个集合, 集合间的操作(交集,差集,并集, 补集, 比较等) php 也提供相应的方法实现
<?php$arr1 = ['a' => 1, 2, 'b' => 3];$arr2 = ['b' => 5, 2];var_dump( array_merge($arr1, $arr2) ); /*array(4) {  ["a"]=>  int(1)  [0]=>  int(2)  ["b"]=>  int(5)  [1]=>  int(2)}// 你也可以使用 + 操作符, 请注意两种方法结果的差别var_dump($arr1 + $arr2); */<?php$arr1 = [1, 2, 3];$arr2 = [5, 2];var_dump( array_intersect($arr1, $arr2) );  // [2]<?php$a = [1, 2];$b = ['1' => 2, 0 => 1, 4];//array_diff 按照索引 和 值 比较差异var_dump(array_diff($a, $b));// array_diff_key() 函数用于比较两个(或更多个)数组的键名 ,并返回差集 var_dump(array_diff_key($a, $b)); <?php$arr = [1, 2, 3, 4, 5, 6, 7, 8];// 从第3个元素开始, 直到结束var_dump(array_slice($arr, 2));// 从第3个元素开始, 长度为4var_dump(array_slice($arr, 2, 4));// 从第3个元素开始,到倒数第3个元素var_dump(array_slice($arr, 2, -2));// 注意 索引的差别var_dump(array_slice($arr, 2, -2, true));<?php// 按照值(value)升序排序, 索引更新$arr = [6,'a'=>2, 3, 4, 6, -1, 7, 8];sort($arr);var_dump($arr);// 按照值(value)升序排序, 索引保持$arr = [6,'a'=>2, 3, 4, 6, -1, 7, 8];asort($arr);var_dump($arr);// 按照值(value)降序排序, 索引保持$arr = [6,'a'=>2, 3, 4, 6, -1, 7, 8];arsort($arr);var_dump($arr);// 按照 键(key)进行升序排序 , 索引保持$arr = ['a' => 10, 'c' => 1, 'b' => 12];ksort($arr);var_dump($arr);// 按照 键(key)进行降序排序 , 索引保持$arr = ['a' => 10, 'c' => 1, 'b' => 12];krsort($arr);var_dump($arr);// 用户自定义排序, 根据值(value) , 索引更新// 请注意:对于自定义的比较函数,// 在第一个参数小于,等于或大于第二个参数时,// 该比较函数必须相应地返回一个小于,等于或大于 0 的整数。function cmp($val1, $val2){    if($val1 > $val2) {        return 1;    } elseif ($val1 == $val2) {        return 0;    } else {        return -1;    }}$arr = [    'a' => 1,    'A' => 3,    'B' => 2,];usort($arr, cmp);var_dump($arr);// 根据key 自定义排序规则,请使用 uksort(), 用法同usort()<?phpvar_dump(explode(',', "a,a,a,a,a,a")); // 以,为分割符将字符串"a,a,a,a,a,a" 切割成数组var_dump(implode('-', [1, 2, 3, 4, 5])); //以 - 为 拼接符 将 数组[1, 2, 3, 4, 5] 拼接成字符串
关于php 更多数组相关的函数, 可以参考 官方文档php数组函数列表

四、数组模拟常见数据结构
php 数组可以模拟常见的数据结构,最显而易见的便是 映射表 和 字典, 这里简单介绍php数组对栈和队列的模拟。
<?php$stack = [1, 2, 3, 4];//入栈array_push($stack, -1);var_dump($stack); // [1, 2, 3, 4, -1]//出栈$e = array_pop($stack);var_dump($e); // -1var_dump($stack);  // [1, 2, 3, 4]<?php$queue = [];//入队列array_unshift($queue, 1);array_unshift($queue, 2);array_unshift($queue, 3);array_unshift($queue, 4);//出队列$e = array_pop($queue);var_dump($e); // 1$e = array_pop($queue);var_dump($e); // 2$e = array_pop($queue);var_dump($e); // 3$e = array_pop($queue);var_dump($e); // 4
五、php数组使用须知与注意点
因此以下代码可能导致意外的结果,请注意以下代码的输出:
<?php$arr = [1, 2, '8' => 3];$arr[false] = -20;var_dump($arr); // [-20, 2, '8' => 3]$arr[8] = 20;var_dump($arr); // [-20, 2, 8 => 20]$arr[8.7] = 15;var_dump($arr); // [-20, 2, 8 => 15]$arr["8.7"] = 10;var_dump($arr); // [-20, 2, 8 => 10]$arr[$val]  = 5; // 注意$val之前为声明,因此默认值为null, 数组key为null时会被转为""空串var_dump($arr); // [-20, 2, 8 => 10, "" => 5]$arr[bar] = 6; // 标识符被转化为 'bar'var_dump($arr); // [-20, 2, 8 => 10, "" => 5, 'bar' => 6]<?php$var = true;var_dump((array)$var);/* array(1) {  [0]=>  bool(true)}*/$var = 1;var_dump((array)$var);/* array(1) {  [0]=>  int(1)}*/$var = 1.1;var_dump((array)$var);/* array(1) {  [0]=>  float(1.1)}*/$var = "111";var_dump((array)$var);/* array(1) {  [0]=>  string(3) "111"}*/$var = null;var_dump((array)$var);  // 返回空数组/* array(0) {} */class Cls { public $a = 1; protected $b = 2; private $c = 3; }var_dump((array)(new Cls)); // 可见性不同 key值格式有所不同/* array(3) {  ["a"]=>  int(1)  ["*b"]=>  int(2)  ["Clsc"]=>  int(3)} */
关于PHP类型转换的了解,请参考PHP-类型转换的判别

六、FAQ<?php if (isset($arr[$key]) or array_key_exists($key, $arr)) { ...}

作者: 不二晨    时间: 2018-11-14 15:25
~(。≧3≦)ノ⌒☆
作者: 梦缠绕的时候    时间: 2018-11-15 14:59

作者: 魔都黑马少年梦    时间: 2018-11-15 16:34

作者: 小影姐姐    时间: 2018-11-15 17:16
奈斯~




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2