2016-01-04 2 views
0

Я хочу Concat значения массива с таким же ключом Пример:Concat значения массива с таким же ключом

[0] => Array 
     (
      [0] => A 
      [1] => XYZ 
     ) 

[1] => Array 
    (
     [0] => B 
     [1] => ABC 
    ) 

[2] => Array 
    (
     [0] => A 
     [1] => LMN 
    ) 

[3] => Array 
    (
     [0] => B 
     [1] => PQR 
    ) 
) 

Ожидаемый результат:

[0] => Array 
     (
      [0] => A 
      [1] => XYZ,LMN 
     ) 

[1] => Array 
    (
     [0] => B 
     [1] => ABC,PQR 
    ) 
) 
+1

вы пробовали что-нибудь? – axiac

ответ

1

Простое решение использует функцию PHP array_reduce():

// The input array you posted in the question 
$input = array(
    array('A', 'XYZ'), 
    array('B', 'ABC'), 
    array('A', 'LMN'), 
    array('B', 'PQR'), 
); 

// Reduce the array to a new array that contains the data aggregated as you need 
$output = array_reduce(
    // Process each $item from $input using a callback function 
    $input, 
    // The callback function processes $item; the partial result is $carry 
    function (array $carry, array $item) { 
     // Extract the key into a variable 
     $key = $item[0]; 
     // If the key was encountered before 
     // then a partial entry already exists in $carry 
     if (isset($carry[$key])) { 
      // Append the desired value to the existing entry 
      $carry[$key][1] .= ','.$item[1]; 
     } else { 
      // Create a new entry in $carry (copy $item to key $key for quick retrieval) 
      $carry[$key] = $item; 
     } 
     // Return the updated $carry 
     return $carry; 
    }, 
    // Start with an empty array (it is known as $carry in the callback function) 
    array() 
); 

// $output contains the array you need 
0

Попробуйте это:

$final = array(); 

foreach ($array_items as $item) 
{ 
    $key = $item[0]; 
    $found_index = -1; 

    for ($i=0; $i<count($final); $i++) 
    { 
     if ($key == $final[$i][0]) 
     { 
      $found_index = $i; 
      break; 
     } 
    } 

    if ($found_index == -1) 
    { 
     $final_item = array(); 
     $final_item[0] = $key; 
     $final_item[1] = $item[1]; 
     $final[] = $final_item; 
    } 
    else 
    { 
     $final[$found_index][1] .= ",".$item[1]; 
    } 
} 

Мы создаем новый массив $final и прокручиваем ваш старый массив $array_items. Для каждого элемента мы видим, есть ли элемент в $final, который имеет тот же индекс [0]. Если он не существует, мы создаем его и добавляем начальную строку в индекс [1]. Если он существует, нам просто нужно добавить строку в конец индекса [1].

Попробуйте, заменив $array_items тем, что вызвал ваш массив, сообщите мне, если он работает.

0

Проверьте мое решение. Он должен работать нормально. Надеюсь, это вам очень поможет.

$result = $passed_keys = $extended_arr = []; 
foreach ($arr as $k => $value) { 
    for($i = $k + 1; $i < count($arr); $i++){ 
     if ($value[0] == $arr[$i][0]){ // compare each array with rest subsequent arrays 
      $key_name = $value[0]; 
      if (!array_key_exists($key_name, $result)){ 
       $result[$key_name] = $value[1] .",". $arr[$i][1]; 
      } else { 
       if (!in_array($i, $passed_keys[$key_name])) { 
        $result[$key_name] .= ",". $arr[$i][1]; 

       } 
      } 
      $passed_keys[$key_name][] = $i; // memorizing keys that were passed 
     } 
    } 
} 
array_walk($result, function($v, $k) use(&$extended_arr){ 
    $extended_arr[] = [$k, $v]; 
}); 

В результате в $extended_arr

0

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

<?php 
$inital_array = array(
    array('A','XYZ'), 
    array('B','ABC'), 
    array('A','LMN'), 
    array('B','PQR') 
); 

$concat_array = array(); 

foreach($inital_array as $a){ 
    $key = $a[0]; 

    if(!isset($concat_array[$key])){ 
     $concat_array[$key] = array($key,''); 
    } 

    $concat_array[$key][1] .= (empty($concat_array[$key][1]) ? '' : ',').$a[1]; 
} 

$concat_array = array_values($concat_array); 

echo '<pre>',print_r($concat_array),'</pre>'; 
Смежные вопросы