如果在另一个数组中重复数组值,请合并两个数组

时间:2018-02-07 05:52:05

标签: php arrays

我有几个数组要检查重复值,如果发现其他数组中的某个数据重复,则将这两个数组合并在一起。

我在下面举例说明了2个具有重复值的数组。

示例: tracking_number中的值在下面的两个数组中都相同。它们不是唯一的价值观。但purchase_order_number中的值是唯一的。

我想检查tracking_number中的值是否在另一个数组中重复。如果在另一个数组中找到相同的值,则将这两个数组合并为1个数组。

service中的值在2个或更多数组中相同时,我试图将purchase_order_number array ( 'data' => array ( 15 => array ( 'type' => 'Tracking', 'id' => 2830143, 'attributes' => array ( 'tracking_number' => '1Z5270560360309870', 'service' => 'UPS', 'order_id' => 2606218, 'purchase_order_number' => '7249491', 'recipient_attempts' => 1, ), ), 16 => array ( 'type' => 'Tracking', 'id' => 2830144, 'attributes' => array ( 'tracking_number' => '1Z5270560361740866', 'service' => 'UPS', 'order_id' => 2606218, 'purchase_order_number' => '7249491', 'recipient_attempts' => 1, ), ), ), ) 中的值合并为一个数组。

以下示例数组。

未合并

    array (
      'data' => 
      array (
        16 => 
        array (
          'type' => 'Tracking',
          'id' => 2830144,
          'attributes' => 
          array (
            'tracking' => 
            array (
              0 => 
              array (
                'tracking_number' => '1Z5270560360309870',
                'service' => 'UPS',
              ),
              1 => 
              array (
                'tracking_number' => '1Z5270560361740866',
                'service' => 'UPS',
              ),
            ),
            'order_id' => 2606218,
            'purchase_order_number' => '7249491',
            'recipient_attempts' => 1,
          ),
        ),
      ),
    )

下面给出了我需要如何组合上述两个数组的示例。

联合

(?<a>(\(\d+;\d+\))|(\d+\/\d+))(?<b>[^\(_]+)(_(?<c>[^\(]+))?

1 个答案:

答案 0 :(得分:0)

这是一个基于 reduce 的解决方案,但需要注意:

$arr['data'] = array_reduce($arr['data'], function ($out, $item) {
    // keys we want to extract
    static $tracking_keys = ['tracking_number' => '', 'service' => ''];
    // yank tracking keys from attributes
    $tracking = array_intersect_key($item['attributes'], $tracking_keys);
    $item['attributes'] = array_diff_key($item['attributes'], $tracking_keys);
    // insert to new array based on order number
    $order_no = $item['attributes']['purchase_order_number'];
    if (!isset($out[$order_no])) {
        $item['attributes']['tracking'] = [$tracking];
        $out[$order_no] = $item;
    } else {
        array_push($out[$order_no]['attributes']['tracking'], $tracking);
    }
    return $out;
}, []);

'data'中的键未被保留,'id'由第一项设置。