2012-07-06 6 views
0

Я хотел бы создать функцию в PHP, которая объединяет строки массива с общим значением столбца.Добавление повторяющихся строк массива в Php

Таким образом, вход.

$test = array(
    array("c", 5, 6), 
    array("c", 2, 3), 
    array("test", 5, 6) 
); 

И выход.

$testduplicatefree = array(
    array("c", 7, 9), 
    array("test", 5, 6) 
    ) 
); 

Я думаю

function combine_duplicates($array,$col){ 
... 
... 
return $duplicatefreearray; 
} 

где $ цв являются дубликатом бесплатного массива. Итак, в моем случае,

combine_duplicates($test,0); 

бы получить мне мой желаемый результат. Спасибо за любую помощь в этом.

+0

Я пробовал много функций, подобных решениям здесь, но я не мог работать. – user1507889

ответ

1
<?php 

function combine_duplicates($array,$col) { 
    $index = array(); 
    foreach ($array as $row) { 
     $key = $row[$col]; 
     if (!isset($index[$key])) { 
      $index[$key] = $row; 
     } else { 
      for ($i = 0; $i < count($row); ++$i) { 
       if ($i != $col) { 
        $index[$key][$i] += $row[$i]; 
       } 
      } 
     } 
    } 

    return array_values($index); 
} 


$array = array(
    array("c", 5, 6), 
    array("c", 2, 3), 
    array("test", 5, 6) 
); 

print_r(combine_duplicates($array, 0)); 

Попробуйте здесь: http://codepad.org/MDHEsqhi

1

Я полагаю, что первое значение в каждом массиве (в данном случае, «с») является ключом, который используется, чтобы определить, если две строки являются дубликатами. В этом случае, вы могли бы заменить массив, который вы дали с индексным массивом, который выглядит как:

array(
    c=>array(5,6) 
    test=>array(5,6) 
    ... 
) 

Добавить ваши ряды один за другим, и тест на ли индекс вы бы использовать уже есть, например, if in_array("c", array_keys($my_array)). Если индекса нет, создайте новый массив с этим индексом. Если он есть, вместо этого перебирайте строку и добавьте каждое ее значение в соответствующий столбец в существующем массиве. например, когда вы попали во вторую строку с ключом «c», вы должны добавить свое первое значение в $my_array["c"][0], а второе значение - $my_array["c"][1].

+0

FYI, arnaud576875 и я отправил наши ответы самостоятельно. Моя находится в тексте, а их код - в коде, но насколько я могу судить, алгоритмы идентичны. – octern

+0

Да, спасибо. Я ценю объяснение здесь. – user1507889