PHP 中的 array 实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。此类型针对多种不同用途进行了优化; 它可以被视为数组、列表(向量)、哈希表(映射的实现)、字典、集合、堆栈、队列等等。 由于 array 的值可以是其它 array 所以树形结构和多维 array 也是允许的。
PHP数组的定义
可以用 array() 语言结构来新建一个 array。它接受任意数量用逗号分隔的 键(key) => 值(value) 对。最后一个数组单元之后的逗号可以省略。通常用于单行数组定义中,例如常用 array(1, 2) 而不是 array(1, 2, )。对多行数组定义通常保留最后一个逗号,这样要添加一个新单元时更方便。
array(
key => value,
key2 => value2,
key3 => value3,
...
)
// 使用短数组语法
$array = [
"foo" => "bar",
"bar" => "foo",
];
数组值的访问
用方括号语法访问数组单元,数组单元可以通过 array[key] 语法来访问。应该始终在用字符串表示的数组索引上加上引号。例如用 $foo['bar'] 而不是 $foo[bar]。但是为什么呢?可能在老的脚本中见过如下语法:
<?php
$foo[bar] = 'enemy';
echo $foo[bar];
// 及其它
?>
这样是错的,但可以正常运行。那么为什么错了呢?原因是此代码中有一个未定义的常量( bar )而不是 string('bar'-注意引号)。而 PHP 可能会在以后定义此常量,不幸的是你的代码中有同样的名字。它能运行,是因为 PHP 自动将裸字符串(没有引号的 string 且不对应于任何已知符号)转换成一个其值为该裸 string 的 string。例如,如果没有常量定义为 bar,那么PHP 将在 string 中替代为 'bar' 并使用之。
看完检查了一下自己刚写的代码,发现都没有加单引号-_-!!!
删除元素
<?php
$arr = array(5 => 1, 12 => 2);
$arr[] = 56; // 这与 $arr[13] = 56 相同;
// 在脚本的这一点上
$arr["x"] = 42; // 添加一个新元素
// 键名使用 "x"
unset($arr[5]); // 从数组中删除元素
unset($arr); // 删除整个数组
?>
unset() 函数允许删除 array 中的某个键。但要注意数组将不会重建索引。如果需要删除后重建索引,可以用 array_values() 函数重建 array 索引。个人理解这一点对于数字类的索引可能会引起顺序上的误判,字符类的索引似乎没有大的影响。
<?php
$a = array(1 => 'one', 2 => 'two', 3 => 'three');
unset($a[2]);
/* 该数组将被定义为
$a = array(1 => 'one', 3 => 'three');
而不是
$a = array(1 => 'one', 2 =>'three');
*/
$b = array_values($a);
// 现在 $b 是 array(0 => 'one', 1 =>'three')
?>
常用数组函数
array_change_key_case
— 将数组中的所有键名修改为全大写或小写array_chunk
— 将一个数组分割成多个array_column
— 返回输入数组中指定列的值array_combine
— 创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值array_count_values
— 统计数组中每个不同值的出现次数array_diff_assoc
— 带索引检查计算数组的差集array_diff_key
— 使用键名比较计算数组的差集array_diff_uassoc
— 用用户提供的回调函数做索引检查来计算数组的差集array_diff_ukey
— 用回调函数对键名比较计算数组的差集array_diff
— 计算数组的差集array_fill_keys
— 使用指定的键和值填充数组array_fill
— 用给定的值填充数组array_filter
— 使用回调函数过滤数组的元素array_flip
— 交换数组中的键和值array_intersect_assoc
— 带索引检查计算数组的交集array_intersect_key
— 使用键名比较计算数组的交集array_intersect_uassoc
— 带索引检查计算数组的交集,用回调函数比较索引array_intersect_ukey
— 在键名上使用回调函数来比较计算数组的交集array_intersect
— 计算数组的交集array_is_list
— 判断给定的 array 是否为 listarray_key_exists
— 检查数组里是否有指定的键名或索引array_key_first
— 获取指定数组的第一个键array_key_last
— 获取一个数组的最后一个键值array_keys
— 返回数组中部分的或所有的键名array_map
— 为数组的每个元素应用回调函数array_merge_recursive
— 递归地合并一个或多个数组array_merge
— 合并一个或多个数组array_multisort
— 对多个数组或多维数组进行排序array_pad
— 以指定长度将一个值填充进数组array_pop
— 弹出数组最后一个单元(出栈)array_product
— 计算数组中所有值的乘积array_push
— 将一个或多个单元压入数组的末尾(入栈)array_rand
— 从数组中随机取出一个或多个随机键array_reduce
— 用回调函数迭代地将数组简化为单一的值array_replace_recursive
— 使用传递的数组递归替换第一个数组的元素array_replace
— 使用传递的数组替换第一个数组的元素array_reverse
— 返回单元顺序相反的数组array_search
— 在数组中搜索给定的值,如果成功则返回首个相应的键名array_shift
— 将数组开头的单元移出数组array_slice
— 从数组中取出一段array_splice
— 去掉数组中的某一部分并用其它值取代array_sum
— 对数组中所有值求和array_udiff_assoc
— 带索引检查计算数组的差集,用回调函数比较数据array_udiff_uassoc
— 带索引检查计算数组的差集,用回调函数比较数据和索引array_udiff
— 用回调函数比较数据来计算数组的差集array_uintersect_assoc
— 带索引检查计算数组的交集,用回调函数比较数据array_uintersect_uassoc
— 带索引检查计算数组的交集,用单独的回调函数比较数据和索引array_uintersect
— 计算数组的交集,用回调函数比较数据array_unique
— 移除数组中重复的值array_unshift
— 在数组开头插入一个或多个单元array_values
— 返回数组中所有的值array_walk_recursive
— 对数组中的每个成员递归地应用用户函数array_walk
— 使用用户自定义函数对数组中的每个元素做回调处理array
— 新建一个数组arsort
— 对数组进行降向排序并保持索引关系asort
— 对数组进行升序排序并保持索引关系compact
— 建立一个数组,包括变量名和它们的值count
— 统计数组、Countable 对象中所有元素的数量current
— 返回数组中的当前值each
— 返回数组中当前的键/值对并将数组指针向前移动一步end
— 将数组的内部指针指向最后一个单元extract
— 从数组中将变量导入到当前的符号表in_array
— 检查数组中是否存在某个值key_exists
— 别名 array_key_existskey
— 从关联数组中取得键名krsort
— 对数组按照键名逆向排序ksort
— 对数组根据键名升序排序list
— 把数组中的值赋给一组变量natcasesort
— 用"自然排序"算法对数组进行不区分大小写字母的排序natsort
— 用"自然排序"算法对数组排序next
— 将数组中的内部指针向前移动一位pos
— current 的别名prev
— 将数组的内部指针倒回一位range
— 根据范围创建数组,包含指定的元素reset
— 将数组的内部指针指向第一个单元rsort
— 对数组降序排序shuffle
— 打乱数组sizeof
— count 的别名sort
— 对数组升序排序uasort
— 使用用户定义的比较函数对数组进行排序并保持索引关联uksort
— 使用用户自定义的比较函数对数组中的键名进行排序usort
— 使用用户自定义的比较函数对数组中的值进行排