PHP按条件合并数组求助:匹配time字段填充name值
问题分析与解决方案
错误原因
你的双层循环逻辑存在问题:内层循环会遍历所有$tasks元素,即使找到匹配的time并设置了正确的name,后续不匹配的task会再次将name覆盖为null。比如处理07:30时,第一个task匹配成功设置name为john,但第二个task不匹配,又把name设为null,最终导致匹配值丢失。
正确实现
方案一:优化双层循环逻辑
先默认name为null,找到匹配项后立即跳出内层循环,避免被后续元素覆盖:
$full = []; foreach ($wt as $item) { $entry = ['time' => $item['time'], 'name' => null]; foreach ($tasks as $task) { if ($item['time'] === $task['time']) { $entry['name'] = $task['name']; break; // 找到匹配后终止内层循环 } } $full[] = $entry; }
方案二:预处理任务数组(更高效)
将$tasks转换为以time为键的关联数组,通过键值直接查找,避免重复循环,适合数据量较大的场景:
// 预处理:把tasks转成time为键、name为值的数组 $taskMap = array_column($tasks, 'name', 'time'); $full = []; foreach ($wt as $item) { $time = $item['time']; $full[] = [ 'time' => $time, 'name' => isset($taskMap[$time]) ? $taskMap[$time] : null ]; }
两种方案执行后,都能得到你期望的结果:
$full = [ ['time' => '07:00', 'name' => null], ['time' => '07:30', 'name' => 'john'], ['time' => '08:00', 'name' => 'fred'], ['time' => '08:30', 'name' => null], ['time' => '09:00', 'name' => null], ['time' => '09:30', 'name' => null], ];
内容的提问来源于stack exchange,提问作者Lyubomir Bumbarov
相关产品推荐
相关产品推荐

