PHP 数组浅析
一、概要
二、简单介绍及基本使用
便定义了一个普通数组$arr = array('a' => 1, 'z' => 100);
$arr = [1, 2, 3, 4];
$arr = ['a' => 1, 'z' => 100];
$arr = [1, 'hello' => '11', 'arr' => [1, 'a'=>'b']];
[index]
访问:$arr = [1, 'hello' => '11', 'arr' => [1, 'a'=>'b']];
var_dump($arr[0]); // 1
var_dump($arr['arr']); // [1, 'a' => 'b']
[]
修改数组元素的值$arr = [1, 'hello' => '11', 'arr' => [1, 'a'=>'b']];
$arr[0] = 'test';
var_dump($arr);
$arr = [1, 2, 3, 4];
$arr[] = 'a'; //追加元素
$arr['test'] = 'b'; // 添加 key, value
$arr = [1, 'hello' => '11', 'arr' => [1, 'a'=>'b']];
unset($arr['hello']);
var_dump($arr['hello']); // null
$arr = [1, 'hello' => '11', 'arr' => [1, 'a'=>'b']];
foreach($arr as $key => $value) {
var_dump($key . ' => ' . $value);
}
更多数组遍历的方法请参考php-数组遍历
- 数组之间的比较,数组无法比较大小, 但可以根据一定条件判断是否相等
// $a == $b 相等 如果 $a 和 $b 具有相同的键/值对则为 TRUE。
// $a === $b 全等 如果 $a 和 $b 具有相同的键/值对并且顺序和类型都相同则为 TRUE。
$a = [1, 2];
$b = ['1' => 2, 0 => 1];
var_dump($a == $b); // true
var_dump($a === $b); // false
三、实用的数组工具函数
掌握了数组的基本操作(定义使用,增删改查, 遍历) 之后,你就可以在开发中使用数组, 但只有这些操作是远远不够的,为了满足复杂多变的开发场景对数组操作的需求,PHP 提供了功能强大的一套 Array 操作的函数
$arr = [1, 2, 3];
var_dump(count($arr)); // 3
$arr = [1, 2, 3];
$notArr = '111';
var_dump(is_array($arr)); // true
var_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
$arr = ['a' => 2, 4];
$keys = array_keys($arr); // ['a', 1]
$arr = ['a' => 2, 4];
$values = array_values($arr); // [2, 4]
$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 也提供相应的方法实现
$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); */
array_intersect
$arr1 = [1, 2, 3];
$arr2 = [5, 2];
var_dump( array_intersect($arr1, $arr2) ); // [2]
$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));
$arr = [1, 2, 3, 4, 5, 6, 7, 8];
// 从第3个元素开始, 直到结束
var_dump(array_slice($arr, 2));
// 从第3个元素开始, 长度为4
var_dump(array_slice($arr, 2, 4));
// 从第3个元素开始,到倒数第3个元素
var_dump(array_slice($arr, 2, -2));
// 注意 索引的差别
var_dump(array_slice($arr, 2, -2, true));
// 按照值(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()
var_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数组对栈和队列的模拟。
$stack = [1, 2, 3, 4];
//入栈
array_push($stack, -1);
var_dump($stack); // [1, 2, 3, 4, -1]
//出栈
$e = array_pop($stack);
var_dump($e); // -1
var_dump($stack); // [1, 2, 3, 4]
$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数组使用须知与注意点
因此以下代码可能导致意外的结果,请注意以下代码的输出:
$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数组可以将其他一切类型转为数组,转化的效果请参考一下代码,重点观察对 null 和 object对象的转化:
$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
array_push($arr, key, value)
or $arr[key] = value
?答: 后者更为高效, 更多细节请参考官方资料
答:
isset($arr[key])
会返回 false;而对于array_key_exists
只要对应key存在就会返回true;isset
效率 高于array_key_eixsts
if (isset($arr[$key]) or array_key_exists($key, $arr)) {
...
}
+
和 array_merge
的区别?答:可以参考该资料
array_diff
与 ==
的异同? 答:语义有所差别, 数组的相等比较 推荐只使用 ==
答:foreach 方式 遍历 最为高效
转载地址:PHP 数组浅析