PHP合并数组方法
PHP合并数组方法
引言
合并两个或多个数组是日常开发高频操作。索引数组用array_push或加号,关联数组用array_merge,+号和array_merge在键冲突时行为完全不同,搞混会踩坑。
array_merge 合并
$a = [1, 2];
$b = [3, 4];
$c = array_merge($a, $b);
// [1, 2, 3, 4]
索引数组会重排数字键,关联数组同名键后者覆盖前者。
加号 + 保留原键
$a = ['a' => 1, 'b' => 2];
$b = ['b' => 99, 'c' => 3];
$c = $a + $b;
// ['a'=>1,'b'=>2,'c'=>3] 左侧优先
+号左边数组的键优先,同键不覆盖,保留左侧值。
array_merge vs + 的区别
$a = ['a' => 1];
$b = ['a' => 99];
array_merge($a, $b); // ['a'=>99] 后者覆盖
$a + $b; // ['a'=>1] 左侧保留
关联数组合并要谁覆盖谁,选对函数很关键。
数组合并并去重
$all = array_unique(array_merge($a, $b));
合并后去重,适合标签、权限码这类集合。
追加元素到数组
$list[] = 'new';
array_push($list, 'a', 'b');
单元素直接[]追加最简洁,多元素用array_push。
注意事项
- array_merge会重置数字索引,+号保留原数字键;
- 关联数组同名键,array_merge后者覆盖,+号左侧优先;
- 合并大数组注意内存,别在循环里反复merge;
- array_merge递归合并多维要用array_replace_recursive;
- 空数组合并不会报错;
- 合并后记得检查是否都是数组类型再合并。
总结
array_merge合并数组,数字键重排、关联键后者覆盖;+号运算符左侧优先不覆盖。合并去重用array_unique包一层,追加元素直接[]最简洁。注意两者在同名键上的覆盖方向完全相反,多维递归合并用array_replace_recursive,大数组合并注意内存别在循环里反复操作。
PHP遍历关联数组
PHP遍历关联数组
引言
关联数组用键名而非数字下标组织数据,配置项、接口返回的JSON转成数组后都是关联数组。遍历要同时拿到键和值,foreach是最常用的方式,不同场景配合array_keys、array_walk更灵活。
foreach取键和值
$user = ['name'=>'刘馨怡','age'=>26,'city'=>'连云港'];
foreach ($user as $key => $value) {
echo "$key: $value\n";
}
$key => $value同时拿到键名和值,最通用。
只取值
foreach ($user as $value) {
echo $value;
}
不需要键名时省略$key。
用键名取单个值
echo $user['name'];
// 判断键是否存在
if (isset($user['email'])) {
echo $user['email'];
}
取单值直接下标访问,先isset避免未定义键报错。
array_keys取所有键
$keys = array_keys($user);
print_r($keys); // ['name','age','city']
需要单独处理键名列表时用。
array_walk回调遍历
array_walk($user, function($value, $key) {
echo "$key => $value";
});
适合把遍历逻辑封装成回调。
二维关联数组遍历
$list = [
['id'=>1,'name'=>'A'],
['id'=>2,'name'=>'B']
];
foreach ($list as $row) {
echo $row['id'].'-'.$row['name'];
}
循环里再按键名取子元素。
注意事项
- foreach不会改变原数组指针,比each安全;
- 遍历中不要随意增删键,可能导致迭代异常;
- 关联数组键名大小写敏感;
- 值可能为null时用array_key_exists判断键是否存在,isset对null返回false;
- 大数组遍历时注意内存,避免在循环内重复计算。
总结
关联数组遍历首选foreach的$key => $value形式,单值直接下标加isset判断,取键名用array_keys,封装逻辑用array_walk,二维数组外层foreach内层按键取值。掌握这几种就能应对配置、接口数据等绝大多数场景。