PHP 日本大会 2024

数组函数

参见

另见 is_array()explode()implode()preg_split()unset()

目录

  • array — 创建数组
  • array_all — 检查数组中所有元素是否满足回调函数
  • array_any — 检查数组中至少一个元素是否满足回调函数
  • array_change_key_case — 更改数组中所有键的大小写
  • array_chunk — 将数组分割成块
  • array_column — 返回输入数组中单列的值
  • array_combine — 使用一个数组作为键,另一个数组作为值来创建数组
  • array_count_values — 统计数组中每个不同值的出现次数
  • array_diff — 计算数组的差集
  • array_diff_assoc — 计算数组的差集,并进行额外的索引检查
  • array_diff_key — 使用键比较来计算数组的差集
  • array_diff_uassoc — 计算数组的差集,并进行额外的索引检查,该检查由用户提供的回调函数执行
  • array_diff_ukey — 使用回调函数对键进行比较来计算数组的差集
  • array_fill — 用值填充数组
  • array_fill_keys — 用值填充数组,并指定键
  • array_filter — 使用回调函数过滤数组元素
  • array_find — 返回满足回调函数的第一个元素
  • array_find_key — 返回满足回调函数的第一个元素的键
  • array_flip — 交换数组中所有键与其关联的值
  • array_intersect — 计算数组的交集
  • array_intersect_assoc — 计算数组的交集,并进行额外的索引检查
  • array_intersect_key — 使用键比较来计算数组的交集
  • array_intersect_uassoc — 计算数组的交集,并进行额外的索引检查,通过回调函数比较索引
  • array_intersect_ukey — 使用回调函数对键进行比较来计算数组的交集
  • array_is_list — 检查给定的数组是否为列表
  • array_key_exists — 检查给定的键或索引是否存在于数组中
  • array_key_first — 获取数组的第一个键
  • array_key_last — 获取数组的最后一个键
  • array_keys — 返回数组的所有键或键的子集
  • array_map — 将回调函数应用于给定数组的元素
  • array_merge — 合并一个或多个数组
  • array_merge_recursive — 递归合并一个或多个数组
  • array_multisort — 对多个或多维数组进行排序
  • array_pad — 用值填充数组到指定的长度
  • array_pop — 从数组末尾弹出元素
  • array_product — 计算数组中值的乘积
  • array_push — 将一个或多个元素推送到数组末尾
  • array_rand — 从数组中随机选取一个或多个键
  • array_reduce — 使用回调函数迭代地将数组简化为单个值
  • array_replace — 将传入数组的元素替换到第一个数组中
  • array_replace_recursive — 递归地将传入数组的元素替换到第一个数组中
  • array_reverse — 返回一个元素顺序相反的数组
  • array_search — 在数组中搜索给定值,如果成功则返回第一个对应的键
  • array_shift — 从数组开头移除元素
  • array_slice — 提取数组的一部分
  • array_splice — 删除数组的一部分并用其他内容替换
  • array_sum — 计算数组中值的总和
  • array_udiff — 使用回调函数进行数据比较来计算数组的差集
  • array_udiff_assoc — 计算数组的差集,并进行额外的索引检查,通过回调函数比较数据
  • array_udiff_uassoc — 计算数组的差集,并进行额外的索引检查,通过回调函数比较数据和索引
  • array_uintersect — 使用回调函数进行数据比较来计算数组的交集
  • array_uintersect_assoc — 计算数组的交集,并进行额外的索引检查,通过回调函数比较数据
  • array_uintersect_uassoc — 计算数组的交集,并进行额外的索引检查,通过单独的回调函数比较数据和索引
  • array_unique — 从数组中删除重复值
  • array_unshift — 将一个或多个元素添加到数组开头
  • array_values — 返回数组的所有值
  • array_walk — 将用户提供的函数应用于数组的每个成员
  • array_walk_recursive — 递归地将用户函数应用于数组的每个成员
  • arsort — 按降序排序数组并保持索引关联
  • asort — 按升序排序数组并保持索引关联
  • compact — 创建包含变量及其值的数组
  • count — 统计数组或可计数对象中的所有元素
  • current — 返回数组中的当前元素
  • each — 返回数组中的当前键值对并推进数组游标
  • end — 将数组的内部指针设置为其最后一个元素
  • extract — 从数组中导入变量到当前符号表
  • in_array — 检查数组中是否存在某个值
  • key — 从数组中获取键
  • key_exists — array_key_exists 的别名
  • krsort — 按降序对数组按键排序
  • ksort — 按升序对数组按键排序
  • list — 将变量赋值为数组
  • natcasesort — 使用不区分大小写的“自然顺序”算法对数组进行排序
  • natsort — 使用“自然顺序”算法对数组进行排序
  • next — 推进数组的内部指针
  • poscurrent 的别名
  • prev — 倒回内部数组指针
  • range — 创建一个包含一系列元素的数组
  • reset — 将数组的内部指针设置为其第一个元素
  • rsort — 按降序排序数组
  • shuffle — 打乱数组元素顺序
  • sizeofcount 的别名
  • sort — 按升序排序数组
  • uasort — 使用用户自定义的比较函数排序数组并保持索引关联
  • uksort — 使用用户自定义的比较函数按键排序数组
  • usort — 使用用户自定义的比较函数按值排序数组
添加注释

用户贡献的注释 4 条注释

et2225zas14 at susu dot ru
6 个月前
在使用数组遍历函数时,请注意回调函数中的类型提示。在某些情况下,这可能会默默地导致元素的数据类型发生变化。

<?php
declare(strict_types=1);

// 缺少致命 TypeError,无副作用
$unexpected = array_filter(['123', (string) PHP_INT_MAX], fn (int $item) => true);
var_dump($unexpected);

// 缺少致命 TypeError,类型转换副作用
$unexpectedTypecasting = array_map(fn (int $item) => $item, ['123', (string) PHP_INT_MAX]);
var_dump($unexpectedTypecasting);

// 缺少致命 TypeError,类型转换副作用
$unexpectedTypecasting = array_map(fn (string $item) => $item, [123, PHP_INT_MAX]);
var_dump($unexpectedTypecasting);

// 缺少致命 TypeError,类型转换副作用
$unexpectedTypecasting = array_reduce(['123', (string) PHP_INT_MAX], fn (?int $carry, int $item) => $item);
var_dump($unexpectedTypecasting);

$bigIntValue = bcadd((string) PHP_INT_MAX, '1');
// 致命 TypeError
$expectedTypeError = array_map(fn (int $item) => $item, [$bigIntValue]);
var_dump($expectedTypeError);
?>

以上示例将输出(PHP 版本 8.3.6,error_reporting E_ALL)

<?php
array(2) {
[
0]=>
string(3) "123"
[1]=>
string(19) "9223372036854775807"
}
array(
2) {
[
0]=>
int(123)
[
1]=>
int(9223372036854775807)
}
array(
2) {
[
0]=>
string(3) "123"
[1]=>
string(19) "9223372036854775807"
}
int(9223372036854775807)

致命错误未捕获的 TypeError:{闭包}(): 参数 #1 ($item) 必须是 int 类型,string 给定
?>
permanovd at gmail dot com
6 年前
一个简单的技巧可以帮助你猜测 diff/intersect 或排序函数的功能。

[后缀] assoc - 额外的索引检查。比较值和索引。

例如:array_diff_assoc, array_intersect_assoc。

[后缀] key - 只检查索引。忽略数组的值,只比较索引。

例如:array_diff_key, array_intersect_key。

[后缀] **empty** - 后缀中没有 "key" 或 "assoc" 字样。只比较值。忽略数组的索引。

例如:array_diff, array_intersect。

[前缀] u - 将使用用户定义的函数进行比较。在某些函数中,字母 u 可以使用两次(例如 array_udiff_uassoc),这意味着你必须使用两个函数(一个用于值,一个用于索引)。

例如:array_udiff_uassoc, array_uintersect_assoc。

这同样适用于数组排序函数

[前缀] a - 关联。将保留键。

例如:arsort, asort。

[前缀] k - 按键排序。将按键排序数组。

例如:uksort, ksort。

[前缀] r - 反转。将按反序排序数组。

例如:rsort, krsort。

[前缀] u - 按用户定义的函数排序(与 diff/intersect 相同)。

例如:usort, uasort。
renatonascto at gmail dot com
16 年前
大型数组会占用大量内存,可能会导致内存限制错误。你可以通过在使用完数组后立即销毁它们来减少脚本的内存使用量。我只是简单地销毁了一些不再使用的变量,就能够节省几兆字节的内存。
你可以使用 memory_get_usage() 函数查看内存使用情况/增益。希望这有帮助!
indioeuropeo at driverop dot com
5 年前
我需要从数组中取出一个元素,并通过移动其余元素来更改它在数组中的位置。
这是执行此操作的函数。第一个参数是工作数组。第二个是待移动元素的位置,第三个是将元素移动到的位置。
该函数返回修改后的数组。
<?php
function array_move_elem($array, $from, $to) {
if (
$from == $to) { return $array; }
$c = count($array);
if ((
$c > $from) and ($c > $to)) {
if (
$from < $to) {
$f = $array[$from];
for (
$i = $from; $i < $to; $i++) {
$array[$i] = $array[$i+1];
}
$array[$to] = $f;
} else {
$f = $array[$from];
for (
$i = $from; $i > $to; $i--) {
$array[$i] = $array[$i-1];
}
$array[$to] = $f;
}

}
return
$array;
}

?>
示例
<?php
$array
= array('Cero','Uno','Dos','Tres','Cuatro','Cinco','Seis','Siete','Ocho','Nueve','Diez');
$array = array_move_elem($array, 3, 5); // 将第3个元素移动到第5个位置...
print_r($array);

$array = array_move_elem($array, 5, 3); // 将第5个元素移动到第3个位置,数组保持不变... ;)
print_r($array);

?>
返回
<?php
Array ( [0] => Cero [1] => Uno [2] => Dos [3] => Cuatro [4] => Cinco [5] => Tres [6] => Seis [7] => Siete [8] => Ocho [9] => Nueve [10] => Diez )
Array ( [
0] => Cero [1] => Uno [2] => Dos [3] => Tres [4] => Cuatro [5] => Cinco [6] => Seis [7] => Siete [8] => Ocho [9] => Nueve [10] => Diez )
?>
To Top