php 将一个数组中的相关行数据合并到另一个数组的行中

m1m5dgzv  于 2023-01-24  发布在  PHP
关注(0)|答案(3)|浏览(108)

我有两个二维数组,其中一个数组的相关行数据需要合并到另一个数组。
第一个有当天库存状态的信息--存储在不同的数据库中。
第二个数组包含产品的信息,如名称、描述等。
我希望根据特定的共享值列(product_id)将第二个数组的数据合并或合并到第一个数组中。
到目前为止,我使用了两个foreach循环来合并这两个代码。我该如何改进我的代码呢?
示例数据(公用键为product_id):

$array_one = [
    [
        'product_id' => 1,
        'product_stock' => '1.2',
        'stock_date' => '2022-02-15'
    ],
    [
        'product_id' => 2,
        'product_stock' => '5',
        'stock_date' => '2022-02-15'
    ],
];
$array_two = [
    [
        'product_id' => 1,
        'product_slug' => 'product_one',
        'product_description' => 'this is the product one'
    ],
    [
        'product_id' => 2,
        'product_slug' => 'product_two',
        'product_description' => 'this is the product two'
    ],
    [
        'product_id' => 3,
        'product_slug' => 'product_three',
        'product_description' => 'this is the product three'
    ],
];

我的代码:

$new_array = [];

foreach ($array_one as $key => $value) {
    $new_array[ $value['product_id'] ] = $value ;
}
foreach ($array_two as $key => $value) {
    if ( isset( $new_array[ $value['product_id'] ] ) ) {
        $new_array[ $value['product_id'] ]['product_slug'] = $value['product_slug'];
        $new_array[ $value['product_id'] ]['product_description'] = $value['product_description'];
    }
}

结果符合预期:

array(2) {
  [1]=>
  array(5) {
    ["product_id"]=>
    int(1)
    ["product_stock"]=>
    string(3) "1.2"
    ["stock_date"]=>
    string(10) "2022-02-15"
    ["product_slug"]=>
    string(11) "product_one"
    ["product_description"]=>
    string(23) "this is the product one"
  }
  [2]=>
  array(5) {
    ["product_id"]=>
    int(2)
    ["product_stock"]=>
    string(1) "5"
    ["stock_date"]=>
    string(10) "2022-02-15"
    ["product_slug"]=>
    string(11) "product_two"
    ["product_description"]=>
    string(23) "this is the product two"
  }
}
kqqjbcuj

kqqjbcuj1#

首先修改第二个数组,使其使用产品ID作为键-这使得从第一个数组中查找与产品ID对应的项变得更加容易。

$array_two = array_combine(array_column($array_two, 'product_id'), $array_two);
$new_array = [];
foreach($array_one as $product) {
    $product['product_slug'] = $array_two[$product['product_id']]['product_slug'];
    $product['product_description'] =
         $array_two[$product['product_id']]['product_description'];
    $new_array[$product['product_id']] = $product;
}
p8ekf7hl

p8ekf7hl2#

可以使用array_map函数的一个选项是:

$n_arr = array_map(function ($row) use ($array_two){
    foreach ($array_two as $item){
        if($item['product_id'] == $row['product_id']){
            return $item + $row;
        }
    }
    return false;
},$array_one);
dwthyt8l

dwthyt8l3#

因为可以安全地假设第二个数组包含所有可能的product_id,所以可以将其数据转换为查找数组--具有关联的第一级键的数组,以便可以快速访问相关的行数据。
然后,您只需要遍历第一个数组,并将相关的第二个数组行合并到适当的第一个数组行。(Demo

$lookup = array_column($array_two, null, 'product_id');
var_export(
    array_map(
        fn($row) => $row + $lookup[$row['product_id']],
        $array_one
    )
);

如果您更喜欢迭代的语言构造,那么上述相同的函数式技术可以转换为两个单独的foreach()循环。

相关问题