簡體   English   中英

php 合並兩個 arrays

[英]php merge two arrays

我有兩個 arrays 我想合並但遵循某些條件。

$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] => 
        )

)

我正在失去“約翰”

應該這樣做,以便用第二個陣列檢測第一個陣列。 因此,通過從第一個匹配時間,用名稱填充數組“完整”。 否則,應留空。

任何人都可以幫忙嗎? 謝謝你。

這里發生的事情是因為即使您首先匹配結果也繼續循環,然后在其他迭代中您只是將已經匹配的結果歸零:

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 position 中設置名稱。
  2. 不匹配 07:30 到 08:00 - 在 $k position 處插入 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] => 
        )

)

在這里演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM