php 合并两个2d数组中具有不同键的共享列值上的行数据

eivgtgni  于 11个月前  发布在  PHP
关注(0)|答案(4)|浏览(83)

我两个阵列就这样出发了。
第一阵列

Array
(
    [0] => Array
        (
            [manufacture] => Moto
            [name] => ZSX 125
            [code] => ZS125-48A
            [cc] => 125
            [bike_type] => 3 Motorcycle
            [title] => Mto ZSX 125 
            [about] => The ZSX 
        )

    [1] => Array
        (
            [manufacture] => Moto
            [name] => LSM 125
            [code] => STR125YB
            [cc] => 125
            [bike_type] => 6 Endurancemotor
            [title] => Moto 
            [about] => Moto 
        )
)

字符串
二阵列

Array
(
    [0] => Array
        (
            [id] => 183
            [model] => ZS125-48A
            [engine_brand] => 158FMI-B
            [engine_type] => Single Cylinder
        )

    [1] => Array
        (
            [id] => 172
            [model] => STR125YB
            [engine_brand] => K154FMI
            [engine_type] => Single Cylinder
        )
)


正如你所看到的,第一个数组中的“code”和第二个数组中的“model”是一样的,并且总是会有一个匹配。
这是我想要的数组。

Array
(
    [0] => Array
        (
            [id] => 183
            [model] => ZS125-48A
            [engine_brand] => 158FMI-B
            [engine_type] => Single Cylinder
            [manufacture] => Moto
            [name] => ZSX 125
            [code] => ZS125-48A
            [cc] => 125
            [bike_type] => 3 Motorcycle
            [title] => Moto ZSX 125 
            [about] => The ZSX 
        )

    [1] => Array
        (
            [id] => 172
            [model] => STR125YB
            [engine_brand] => K154FMI
            [engine_type] => Single Cylinder
            [manufacture] => Moto
            [name] => LSM 125
            [code] => STR125YB
            [cc] => 125
            [bike_type] => 6 Endurancemotor
            [title] => Moto 
            [about] => Moto 
        )
)


这可能吗?我已经尝试了array_merge和array_merge_recursive,但它只将第二个数组追加到第一个数组的末尾,它不会在键上合并它。

js81xvg6

js81xvg61#

如果两个数组是同步的(即具有匹配codemodel的项在两个数组中的索引相同),Deceze的解决方案是完美的。如果不是这种情况,您将需要多行代码。
数组需要有字符串键才能与array_merge合并。在这种情况下,你想根据codemodel分别对第一个数组和第二个数组重新设置键。重新设置键后,你可以将它们与array_merge_recursive合并。
在PHP 5.5+中重新设置密钥很容易:

// array_column will conveniently rekey when the second argument is null
$array1 = array_column($array1, null, 'code');
$array2 = array_column($array2, null, 'model');

字符串
在早期版本中稍微复杂一些:

// array_map is a more complicated way to extract a column from an array
// and array_combine will do the rekeying
$array1 = array_combine(
              array_map(function($i) { return $i['code']; }, $array1),
              $array1);
$array2 = array_combine(
              array_map(function($i) { return $i['model']; }, $array2),
              $array2);


在这两种情况下,最后一步是相同的:

$result = array_merge_recursive($array1, $array2);

yfjy0ee7

yfjy0ee72#

在我看来,这应该可以做到:

$array3 = array_map('array_merge', $array1, $array2);

字符串
这将$array1[0]$array2[0]馈送到array_merge,然后$array1[1]$array2[1]等。

7bsow1i6

7bsow1i63#

如果你更喜欢“简单”的代码...:-)

$result = array();
foreach ($one as $a) {
    foreach ($two as $b) {
        if ($a->code == $b->model) {
           array_push($result, array_merge($a, $b));
           break;
        }
    }
}
print_r($result);

字符串

pcww981p

pcww981p4#

如果将第一个数组(最终将其行数据追加到第二个数组中的相关行)转换为查找数组,则可以更高效地处理此任务。通过保持第一个数组的行数据不变并将code值分配为第一级键,您将能够在迭代第二个数组时进行即时匹配。
array_map()函数体中的+是“联合运算符”,这是合并关联数组的一种方便方法。
产品编号:(Demo

$lookup = array_column($array1, null, 'code');
var_export(
    array_map(fn($row) => $row + $lookup[$row['model']], $array2)
);

字符串
对于可能在查找数组中找不到所查找的键的不同情况,可以在Map时回退到“合并”空数组。

array_map(fn($row) => $row + ($lookup[$row['model']] ?? []), $array2)


如果查找数组不能被接受,那么你可以合并数据并将其推入一个临时键控的结果数组,然后在关联数据后删除临时键。Merge row data based on the column value of two 2d arrays

相关问题