How to combine 2 arrays that have the same index a

2019-07-11 14:05发布

I have 2 array like follows:

$array1 = [
 '0' => [
   'no_invoice' => 'INV0001',
   'product_code' => '1111111',
  ], 
 '1' => [
  'no_invoice' => 'INV0001',
  'product_code' => '1111112',
 ]
];

  $array2 = [
    '0' => [
      'product_code' => '1111112',
      'free_valie' => 839,
      'count' => 1240
    ],
  ];

Is it possible to combine arrays above to be like this:

Array(
 [0] => Array
  (
    'no_invoice' => 'INV0001',
    'product_code' => '1111111',
  )
 [1] => Array
  (
    'no_invoice' => 'INV0001',
    'product_code' => '1111112',
    'free_valie' => 839,
    'count' => 1240
  )
)

So, if array have same product code, then it will join like the example above.

I have been tried with use array merge, array_merge($array1, $array2); But the result is like this:

Array(
 [0] => Array
  (
    'no_invoice' => 'INV0001',
    'product_code' => '1111111',
  )
 [1] => Array
  (
    'no_invoice' => 'INV0001',
    'product_code' => '1111112',
  )
 [2] => Array
  (
    'product_code' => '1111112',
    'free_valie' => 839,
    'count' => 1240
  )
)

2条回答
放我归山
2楼-- · 2019-07-11 14:20

Try below one.

$array1 = [
    '0' => [
        'no_invoice'   => 'INV0001',
        'product_code' => '1111111',
    ],
    '1' => [
        'no_invoice'   => 'INV0001',
        'product_code' => '1111112',
    ]
];

$array2 = [
    '0' => [
        'product_code' => '1111112',
        'free_valie'   => 839,
        'count'        => 1240
    ],
];

foreach ($array1 as $key => &$value) {
    $key = array_search($value['product_code'], array_column($array2, 'product_code'));
    if ($key !== false) {
        $value  = array_merge($value, $array2[$key]);
        unset($array2[$key]);
        $array2 = array_values($array2);
    }
}
echo '<pre>';
print_r($array1);
exit;
查看更多
够拽才男人
3楼-- · 2019-07-11 14:33

This code will do what you want. It loops over each value in $array1, using array_search to see if the entrie's product_code is also present in $array2 (by looking through the product_code column of $array2 extracted using array_column). If it is, the values are merged. Note that we use &$val in the foreach, causing the value to be passed by reference which allows it to be modified in the loop

foreach ($array1 as &$val) {
    if (($k = array_search($val['product_code'], array_column($array2, 'product_code'))) !== false) {
        $val = array_merge($val, $array2[$k]);
    }
}

print_r($array1);

Output:

Array
(
    [0] => Array
        (
            [no_invoice] => INV0001
            [product_code] => 1111111
        )

    [1] => Array
        (
            [no_invoice] => INV0001
            [product_code] => 1111112
            [free_valie] => 839
            [count] => 1240
        )

)

Demo on 3v4l.org

查看更多
登录 后发表回答