user4381753
user4381753

Reputation: 71

How to merge an array with child elements

I have an array with same customerid. I want to merge all same customerid arrays in to one with few amends to the array.

Array
(
    [0] => Array
        (
            [customerid] => 13
            [customer_fullname] => Chris
            [profession_id] => 8
            [profession_name] => Producer
         )

    [1] => Array
        (
            [customerid] => 1
            [customer_fullname] => John
            [profession_id] => 8
            [profession_name] => Producer

        )

    [2] => Array
        (
            [customerid] => 13
            [customer_fullname] => Chris
            [profession_id] => 7
            [profession_name] => Camera

        )

)

So now I want a new array to be created like this:

Array(
    [customerid] => 13
    [customer_fullname] => Chris
    [new_array] => array(
        [0]=>[profession_id] => 8, [profession_name] => Producer, 
        [1]=>[profession_id] => 7, [profession_name] => Camera
    )
)

Spent some time on it but wasn't able to get it right

Upvotes: 1

Views: 82

Answers (3)

RomanPerekhrest
RomanPerekhrest

Reputation: 92854

The extended solution which is also well-suited for finding and "merging" multiple groups of entries which has same customerid. Used functions: array_filter, array_count_values, array_keys, array_walk, array_chunk and array_values:

// supposing $arr is your initial array

// finds which 'customerid' has multiple entries
$dupIds = array_filter(array_count_values(array_column($arr, "customerid")), function($v) {
    return $v > 1;
});

$dupIds = array_keys($dupIds);
$result = [];

array_walk($arr, function($v) use(&$result, $dupIds) {
    if (in_array($v['customerid'], $dupIds)) {
        $parts = array_chunk($v, 2, true);
        if (!isset($result[$v['customerid']])) {
            $result[$v['customerid']] = $parts[0] + ['new_array' => [$parts[1]]];
        } else {
            $result[$v['customerid']]['new_array'][] = $parts[1];
        }
    }
});

print_r(array_values($result));

The output:

Array
(
    [0] => Array
        (
            [customerid] => 13
            [customer_fullname] => Chris
            [new_array] => Array
                (
                    [0] => Array
                        (
                            [profession_id] => 8
                            [profession_name] => Producer
                        )

                    [1] => Array
                        (
                            [profession_id] => 7
                            [profession_name] => Camera
                        )
                )
        )
)

Upvotes: 2

user3190433
user3190433

Reputation: 405

Quick hack, maybe there is a nicer solution. Note: The second "for each" loop is only needed if there is the possibility that the arrays don't have the same fields.

function merge($array1, $array2){
     $result = array();
     foreach($array1 as $key => $value){
         if(isset($array2[$key]) && $array2[$key]!=$array1[$key]){
              $result[$key][]=$value;
              $result[$key][]=$array2[$key];
         }else{
              $result[$key]=$value;
         }
     }
     foreach($array2 as $key => $value){
        if(!isset($result[$key])){
             $result[$key] = $value;
        }
     }
     return $result;
}

print_r(merge($array1, $array2));

Upvotes: 1

Will
Will

Reputation: 24699

There are better approaches if you're merging lots of records, but if you want a way to just merge two records as stated, I'd just do this:

$array1 = array(
      'customerid' => 13
      'customer_fullname' => 'John',
      'profession_id' => 8,
      'profession_name' => 'Producer'
);
$array2 = array(
      'customerid' => 13
      'customer_fullname' => 'John',
      'profession_id' => 7,
      'profession_name' => 'Director'
);

function merge_customers($customerA, $customerB)
{
    $newCustomer = array();
    if ($customerA['customerid'] == $customerB['customerid'])
    {
        $newCustomer['customerid'] = $customerA['customerid'];
        $newCustomer['customer_fullname'] = $customerA['customer_fullname'];

        $newCustomer['new_array'] = array(
            array(
                'profession_id' => $customerA['profession_id'],
                'profession_name' => $customerA['profession_name']
            ),
            array(
                'profession_id' => $customerB['profession_id'],
                'profession_name' => $customerB['profession_name']
            )
        );

        return $newCustomer;
    }

    /* We can't merge these if they're different customers. */
    return NULL;
}

Upvotes: 2

Related Questions