在PHP的实际开发中,我们经常会遇到多个关联数组存储同类数据的情况,比如两个数组都存储图书信息,每个元素都包含book_title、author、price等字段,需要将它们合并,并且当book_title相同时,更新指定的字段比如price或者author。下面我们就详细讲解实现这个需求的完整方法。

基础数据结构准备
首先我们先定义两个待合并的关联数组,每个数组的元素都是以book_title作为标识的图书信息,结构如下:
<?php
// 第一个图书数组
$books1 = [
[
'book_title' => 'PHP入门教程',
'author' => '张三',
'price' => 59.9,
'stock' => 100
],
[
'book_title' => 'MySQL实战',
'author' => '李四',
'price' => 69.9,
'stock' => 80
]
];
// 第二个图书数组
$books2 = [
[
'book_title' => 'PHP入门教程',
'author' => '张三',
'price' => 49.9, // 需要更新的价格字段
'stock' => 120
],
[
'book_title' => 'Python基础',
'author' => '王五',
'price' => 79.9,
'stock' => 90
]
];
?>
合并逻辑实现步骤
合并的核心思路是先遍历第一个数组,以book_title作为键名构建一个临时的索引数组,然后遍历第二个数组,判断当前元素的book_title是否已经存在于临时数组中,如果存在就更新指定字段,不存在就直接添加到临时数组。
第一步:构建临时映射数组
我们先遍历第一个数组,把每个元素的book_title作为键,整个元素作为值存入临时数组,方便后续快速查找:
<?php
$map = [];
foreach ($books1 as $book) {
$title = $book['book_title'];
$map[$title] = $book;
}
?>
第二步:遍历第二个数组更新或添加元素
接下来遍历第二个数组,针对每个元素判断book_title是否在临时映射数组中存在,如果存在就更新指定的字段,比如这里我们更新price和stock字段,如果不存在就直接把整个元素加入映射数组:
<?php
foreach ($books2 as $book) {
$title = $book['book_title'];
if (isset($map[$title])) {
// 更新指定字段,这里更新price和stock,author保持不变
$map[$title]['price'] = $book['price'];
$map[$title]['stock'] = $book['stock'];
} else {
// 不存在则直接添加
$map[$title] = $book;
}
}
?>
第三步:获取最终合并后的数组
临时映射数组的键是book_title,我们如果需要得到索引形式的数组,可以使用array_values函数重置键名:
<?php $mergedBooks = array_values($map); // 打印结果查看 print_r($mergedBooks); ?>
完整示例代码
下面是整合了所有步骤的完整代码,可以直接运行查看效果:
<?php
$books1 = [
[
'book_title' => 'PHP入门教程',
'author' => '张三',
'price' => 59.9,
'stock' => 100
],
[
'book_title' => 'MySQL实战',
'author' => '李四',
'price' => 69.9,
'stock' => 80
]
];
$books2 = [
[
'book_title' => 'PHP入门教程',
'author' => '张三',
'price' => 49.9,
'stock' => 120
],
[
'book_title' => 'Python基础',
'author' => '王五',
'price' => 79.9,
'stock' => 90
]
];
$map = [];
// 先放入第一个数组的数据
foreach ($books1 as $book) {
$map[$book['book_title']] = $book;
}
// 处理第二个数组的数据
foreach ($books2 as $book) {
$title = $book['book_title'];
if (isset($map[$title])) {
// 更新指定字段,可根据需求调整要更新的字段
$map[$title]['price'] = $book['price'];
$map[$title]['stock'] = $book['stock'];
} else {
$map[$title] = $book;
}
}
// 得到最终的合并数组
$mergedBooks = array_values($map);
echo "合并后的图书数组:<br/>";
print_r($mergedBooks);
?>
注意事项
- 如果book_title存在重复值,上述逻辑会以后面遍历到的数组的指定字段为准,需要提前确认业务需求是否符合。
- 如果要更新的字段不固定,可以把需要更新的字段名放在一个数组中,遍历字段名进行赋值,提升代码灵活性。
- 确保两个数组中的元素都包含book_title字段,否则会出现未定义索引的报错,可提前添加isset判断。
PHP关联数组book_title数组合并字段更新修改时间:2026-07-18 10:12:28