2016-06-04 3 views
1

У меня есть массив с таким же customerid. Я хочу объединить все одинаковые массивы customerid в один с небольшим количеством изменений в массив.Как слить массив с дочерними элементами

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 

     ) 

) 

Так что теперь я хочу новый массив, который будет создан, как это:

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

провел некоторое время на него, но не смог правильно

+0

Хотите построить массив для 1-го CustomerID omly или для всех? – splash58

+0

Я объединять все те массивы, у которых одинаковый клиент, поэтому в нашем случае есть два клиента с одинаковым идентификатором, поэтому мы их объединяем. – user4381753

+0

А что же [customerid] => 1? – splash58

ответ

2

Есть лучше подходит если вы объединяете множество записей, но если вы хотите, чтобы просто объединить две записи, как указано, я бы просто сделал это:

$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; 
} 
+0

, на самом деле да ... может быть несколько массивов, а не только 2. Какой может быть лучший подход? – user4381753

+0

Я добавлю, что через несколько минут, конечно. – Will

+0

Учитывая ваше обновление, я сделал бы это так, как предложил @RomanPrekhrest :) – Will

1

Быстро взломать, возможно, есть более приятное решение. Примечание: второй цикл «для каждого» необходим только в том случае, если существует вероятность того, что массивы не имеют одинаковых полей.

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

да ... но может быть n число одинаковых клиентов – user4381753

2

расширенное решение, которое также хорошо подходит для поиска и «слияния» несколько групп записей, которая имеет такой же customerid. Используемые функции: array_filter, array_count_values, array_keys, array_walk, array_chunk и 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)); 

Выход:

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 
         ) 
       ) 
     ) 
) 
Смежные вопросы