一、概要
简单介绍及基本使用
php数组 常用标准库函数使用
php数组模拟常见数据结构
php数组使用须知与注意点
-
FAQ
立即学习“PHP免费学习笔记(深入)”;
二、简单介绍及基本使用
PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。
通过
便定义了一个普通数组我们还可以定义关联数组
1, 'z' => 100); >1
如果php版本 >= 5.4 , 我们可以使用更为简洁的方式定义数组
1, 'z' => 100]; 123
php 数组很强大, 可以定义混合类型数组
'11', 'arr' => [1, 'a'=>'b']];12
关于数组的访问操作,可以通过
[index]访问:
'11', 'arr' => [1, 'a'=>'b']]; var_dump($arr[0]); // 1var_dump($arr['arr']); // [1, 'a' => 'b']1234
也可以通过
[]修改数组元素的值
'11', 'arr' => [1, 'a'=>'b']];$arr[0] = 'test'; var_dump($arr); 1234
你也可以在初始化数组继续添加数组元素
当然,删除数组元素的操作必须支持
'11', 'arr' => [1, 'a'=>'b']];unset($arr['hello']); var_dump($arr['hello']); // null1234
开发中经常需要遍历数组, 可使用 foreach :
'11', 'arr' => [1, 'a'=>'b']];foreach($arr as $key => $value) {
var_dump($key . ' => ' . $value);
}12345更多数组遍历的方法请参考php-数组遍历
- 数组之间的比较,数组无法比较大小, 但可以根据一定条件判断是否相等
2, 0 => 1]; var_dump($a == $b); // truevar_dump($a === $b); // false123456789
三、实用的数组工具函数
掌握了数组的基本操作(定义使用,增删改查, 遍历) 之后,你就可以在开发中使用数组, 但只有这些操作是远远不够的,为了满足复杂多变的开发场景对数组操作的需求,php 提供了功能强大的一套 Array 操作的函数
- 获取数组长度
希望判断一个变量是否是数组,可以通过 is_array():
更具key 或者 value, 判断元素 是否在数组中
// 判断key 是否在数组中$arr = ['a' => 2, 4];
var_dump(isset($arr['a'])); // true var_dump(array_key_exists('a', $arr)); // true// 判断 value 是否在数组中in_array(5, $arr); // false1234567获取数组所有键(keys)
2, 4];$keys = array_keys($arr); // ['a', 1]123
获取数组的所有值 (values)
2, 4];$values = array_values($arr); // [2, 4]123
统计数组各个元素值出现的次数 可以使用 array_count_values:
1, 'b' => 2];
var_dump(array_count_values($arr));/*
array(3) {
[1]=>
int(2)
[3]=>
int(1)
[2]=>
int(2)
}
*/1234567891011121314数组与数组之间的操作:数组可以看做一个集合, 集合间的操作(交集,差集,并集, 补集, 比较等) php 也提供相应的方法实现
数组的合并
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);
*/12345678910111213141516171819如果是需要计算两个或跟多数组value的交集, 可使用
array_intersect
PHP房产程序[BBWPS]下载[PHP房产程序|BBWPS]功能介绍 1、5种信息类别发布:出租、求租、出售、求购、楼盘信息,支持会员发布信息审核; 2、灵活的信息参数设置; 3、充足的信息字段; 4、简单易用的发布/编辑功能,支持配图上传; 5、灵活的信息管理功能; 6、信息输出伪静态,方便搜索引擎抓取数据; 7、支持RSS输出; 8、内置数据高速缓冲技术,可灵活设置缓冲功能是否启动及过期时间; 9、支持 Google 地图
数组的差集 (按值value 和 按key)
2, 0 => 1, 4];//array_diff 按照索引 和 值 比较差异var_dump(array_diff($a, $b));// array_diff_key() 函数用于比较两个(或更多个)数组的键名 ,并返回差集 var_dump(array_diff_key($a, $b)); 123456789
如果需要获取子数组, 可以通过 array_slice 产生类似 python 切片的效果
关于数组的排序操作,也是比较常见的开发需求,需要注意的是:php排序函数都是直接作用于数组本身, 而不是返回一个新的有序的数组。, 以下代码提供几种常见的场景, 更多请参考php对数组进行排序:
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()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354关于数组与字符串之间的操作一般有切割字符串,合并数组元素转为字符串两种操作,可以借助explode与implode实现
关于php 更多数组相关的函数, 可以参考 官方文档php数组函数列表
四、数组模拟常见数据结构
php 数组可以模拟常见的数据结构,最显而易见的便是 映射表 和 字典, 这里简单介绍php数组对栈和队列的模拟。
模拟栈(FILO)
模拟队列 (FIFO)
五、php数组使用须知与注意点
php 数组 key值 会存在以下强制转换
包含有合法整型值的字符串会被转换为整型。例如键名 “8” 实际会被储存为 8。但是 “08” 则不会强制转换,因为其不是一个合法的十进制数值。
浮点数也会被转换为整型,意味着其小数部分会被舍去。例如键名 8.7 实际会被储存为 8。
布尔值也会被转换成整型。即键名 true 实际会被储存为 1 而键名 false 会被储存为 0。
Null 会被转换为空字符串,即键名 null 实际会被储存为 “”。
数组和对象不能被用为键名。坚持这么做会导致警告:Illegal offset type。
因此以下代码可能导致意外的结果,请注意以下代码的输出:
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]12345678910111213141516171819202122
关于php数组的类型转换
php数组可以将其他一切类型转为数组,转化的效果请参考一下代码,重点观察对 null 和 object对象的转化:
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)
} */123456789101112131415161718192021222324252627282930313233343536373839404142434445关于PHP类型转换的了解,请参考PHP-类型转换的判别
六、FAQ
如何添加数组元素更为高效?
array_push($arr, key, value)or$arr[key] = value? 答: 后者更为高效, 更多细节请参考官方资料isset or array_key_exists() ? 答:
对于存在key的数组,如果 对应的value = null ,
isset($arr[key])会返回 false;而对于array_key_exists只要对应key存在就会返回true;然而在效率方面,
isset效率 高于array_key_eixsts
在判断数组元素是否存在的最佳实践如下:
数组合并
+和array_merge的区别? 答:可以参考该资料array_diff与==的异同? 答:语义有所差别, 数组的相等比较 推荐只使用==遍历方式那种更高效? 答:foreach 方式 遍历 最为高效










