【问题标题】:How to combine 2 arrays that have the same index and value with php?如何将具有相同索引和值的2个数组与php结合起来?
【发布时间】:2019-05-25 03:01:27
【问题描述】:

我有 2 个数组,如下所示:

$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
    ],
  ];

是否可以将上面的数组组合成这样:

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

所以,如果数组有相同的产品代码,那么它将像上面的例子一样加入。

我已经尝试过使用数组合并,array_merge($array1, $array2); 但是结果是这样的:

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
  )
)

【问题讨论】:

  • 问题中无需添加“已解决”;接受一个答案就是这样标记它。
  • 好的先生,.....

标签: php arrays yii2 frameworks


【解决方案1】:

此代码将执行您想要的操作。它循环遍历$array1 中的每个值,使用array_search 查看条目的product_code 是否也存在于$array2 中(通过查看使用array_column 提取的$array2product_code 列)。如果是,则合并这些值。请注意,我们在 foreach 中使用了&$val,导致值通过引用传递,从而允许在循环中对其进行修改

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);

输出:

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

【讨论】:

  • 很高兴我能帮上忙。
  • 请问,为什么要在 &val 上给出 & ? &val 是什么意思?
  • 表示该值是通过引用传递的,这允许在循环中对其进行修改。如果您尝试不带& 的代码,您会发现它不会修改$array1
【解决方案2】:

试试下面的一个。

$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;

【讨论】:

  • 这与我发布的答案有何不同?
  • 看起来没什么区别,只是取消设置匹配的数组。
猜你喜欢
  • 1970-01-01
  • 2021-07-05
  • 2013-03-07
  • 1970-01-01
  • 2022-01-17
  • 2015-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多