繁体   English   中英

将2个关联数组合并为1

[英]Merging 2 associative arrays into 1

我在合并阵列时遇到了麻烦,不知道自己做错了什么。 请考虑以下代码:

$array1 = [
    [ 'job' => '123', 'who' => 'Alpha' ],
    [ 'job' => '789', 'who' => 'Bravo' ]
];

$array2 = [
    [ 'job' => '123', 'when' => 'Today' ]
];

$desiredArray = [
    [ 'job' => '123', 'who' => 'Alpha', 'when' => 'Today' ],
    [ 'job' => '789', 'who' => 'Bravo', 'when' => '' ]
];

这就是我一直在努力做的事情:

$newArray = [];

foreach ($array2 as $row) {
    foreach ($array1 as $record) {
        if ($row['job'] === $record['job']) {
            $tempArray = [
                'when' => $row['when']
            ];
            $newRecord = array_merge($record, $tempArray);
            array_push($newArray, $newRecord);
        };
    };
};

这种方法有效,但问题是当没有匹配时,它仍然需要将原始记录放入我的新数组中。 我试过把一些东西放在if语句之外,但是我的循环卡住了。 任何帮助表示赞赏。

如果使用job作为键提取数组, job容易。 只需循环第一个数组并在第二个数组中检查相同的键并合并:

$a1 = array_column($array1, null, 'job');
$a2 = array_column($array2, null, 'job');

foreach($a1 as $key => $val) {
    $result[] = isset($a2[$key]) ? $val + $a2[$key] : $val;
}

或者与内置相同:

$result = array_replace_recursive(array_column($array1, null, 'job'),
                                  array_column($array2, null, 'job'));

如果你需要重新索引:

$result = array_values($result);

我认为你颠倒了循环,我还添加了一个$exist exists变量来检查$array1中的项目是否在$array2中不存在(所以我可以添加它)

  foreach ($array1 as $row) {
        $exists = false;
        foreach ($array2 as $record) {
            if ($row['job'] === $record['job']) {
                $tempArray = [
                    'when' => $record['when']
                ];
                $newRecord = array_merge($row, $tempArray);
                array_push($newArray, $newRecord);
                $exists =true;
            };
        }; 
        if(!$exists ){
            array_push($newArray, $row);    
        }
    };

从2个阵列中的一个开始,并与另一个阵列合并。 标记未找到的内容:

$newArray = $array1;

foreach ($array2 as $row) { //You need to eventually deal with all of these somehow
    $found = false;
    foreach ($newArray as $key => $record) {
        if ($row['job'] === $record['job']) {
            $found = true;
            $newArray[$key] += $row; //Merge if found
        }
    }
    if (!$found) {
       $newArray[] = $row; //Append if not found
    }
}

你在array1中添加了when键,就可以这样做。

$jobs_time = array_combine(array_column($array2, 'job'), array_column($array2, 'when'));
$result = array_map(function($v)use($jobs_time){
    $v['when'] = isset($jobs_time[$v['job']]) ? $jobs_time[$v['job']] : '';
    return $v;
}, $array1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM