php合并两个数组



我有两个数组要合并,但要满足某些条件。

$wt = [
['time' =>'07:00'],
['time' =>'07:30'],
['time' =>'08:00'],
['time' =>'08:30'],
['time' =>'09:00'],
['time' =>'09:30'],
];
$tasks = [
['time' => '07:30', 'name' => 'john'],
['time' => '08:00', 'name' => 'fred'],
];

想要的结果应该是这样的:

$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],
];

我在循环,但我在某个地方犯了一个错误。


$full = []; // this is the merge array
foreach ($wt as $k => $item) {
$full[$k]['time'] = $item['time'];
foreach ($tasks as $task) {
if($item['time'] == $task['time']) {
$full[$k]['name'] = $task['name'];  
} else {
$full[$k]['name'] = null;
}
}   
}

这是我的错误结果。。。

Array
(
[0] => Array
(
[time] => 07:00
[name] => 
)
[1] => Array
(
[time] => 07:30
[name] => 
)
[2] => Array
(
[time] => 08:00
[name] => fred
)
[3] => Array
(
[time] => 08:30
[name] => 
)
[4] => Array
(
[time] => 09:00
[name] => 
)
[5] => Array
(
[time] => 09:30
[name] => 
)
)

我失去了"约翰">

应该这样做,使得第一阵列与第二阵列一起被检测。因此,通过匹配第一个数组的时间,用名称填充数组"full"。否则,应将其留空。

有人能帮忙吗?非常感谢。

这里发生的事情是因为即使一开始匹配结果,也会继续循环,然后在其他迭代中,只会使已经匹配的结果无效:

foreach ($tasks as $task) {
if($item['time'] == $task['time']) {
$full[$k]['name'] = $task['name'];  
} else {
$full[$k]['name'] = null;
}
} 

如果你要调试它:

  1. 匹配07:30到07:30-没关系,您将名称设置在$k位置
  2. 07:30到08:00不匹配-在$k位置的名称中插入null

如果第二个数组中有第三个项,那么第二个项也会丢失,所以只需在匹配一个值后添加break即可。

foreach ($tasks as $task) {
if($item['time'] == $task['time']) {
$full[$k]['name'] = $task['name'];
break;  
} 
$full[$k]['name'] = null;

} 

也就是说,我想建议更优雅的方法来做到这一点:

$wt = [
['time' =>'07:00'],
['time' =>'07:30'],
['time' =>'08:00'],
['time' =>'08:30'],
['time' =>'09:00'],
['time' =>'09:30'],
];
$tasks = [
['time' => '07:30', 'name' => 'john'],
['time' => '08:00', 'name' => 'fred'],
];
$tasks_time_values = array_column($tasks, 'time');
$tasks_name_values = array_column($tasks, 'name');
$new_tasks = array_combine($tasks_time_values, $tasks_name_values);
print_r($new_tasks);
$full = array_map(function ($w) use ($new_tasks) {
$w['name'] = $new_tasks[$w['time']] ?? null;
return $w;
}, $wt);
print_r($full);

输出:

Array
(
[07:30] => john
[08:00] => fred
)
Array
(
[0] => Array
(
[time] => 07:00
[name] => 
)
[1] => Array
(
[time] => 07:30
[name] => john
)
[2] => Array
(
[time] => 08:00
[name] => fred
)
[3] => Array
(
[time] => 08:30
[name] => 
)
[4] => Array
(
[time] => 09:00
[name] => 
)
[5] => Array
(
[time] => 09:30
[name] => 
)
)

此处演示

最新更新