2015-07-05 3 views
0

У меня есть следующий массив.Как суммировать дубликаты массива в php

[0]=> 
    array(7) { 
     [0]=>31 
     [1]=>14 
     [2]=>on 
     [3]=>receiver 
     [4]=>pollin 
     [5]=>0000-e8-de-27-176d10 
     [6]=>1 
    } 
    [1]=> 
    array(7) { 
     [0]=>31 
     [1]=>14 
     [2]=>on 
     [3]=>receiver 
     [4]=>pollin 
     [5]=>0000-e8-de-27-176d10 
     [6]=>5 
    } 
    [2]=> 
    array(7) { 
     [0]=>0 
     [1]=>17 
     [2]=>"on" 
     [3]=>"receiver" 
     [4]=>"elro_400" 
     [5]=>"0000-e8-de-27-176d10" 
     [6]=>1 
    } 

Я пытаюсь суммировать значение [6] вместе, но только если значение ключа 0-5 одинаковы. так что ожидаемый результат будет таким:

[0]=> 
    array(7) { 
     [0]=>31 
     [1]=>14 
     [2]=>on 
     [3]=>receiver 
     [4]=>pollin 
     [5]=>0000-e8-de-27-176d10 
     [6]=>6 
    } 
    [1]=> 
    array(7) { 
     [0]=>0 
     [1]=>17 
     [2]=>"on" 
     [3]=>"receiver" 
     [4]=>"elro_400" 
     [5]=>"0000-e8-de-27-176d10" 
     [6]=>1 
    } 

Я пробовал сам с if(array_key_exists($vals[0]&&$vals[1]&&$vals[2]&&$vals[3]&&$vals[4]&&$vals[5],$res)) однако это не работает, как я думал, что это будет работать.

EDIT:

То, что я пытаюсь сделать, это удалить дубликаты, если [0] - [5] являются одинаковыми. Но когда он удаляет дубликат, он должен суммировать [6] вместе.

Простой пример:

[0]=> 
    array(3) { 
     [0]=>31 
     [1]=>14 
     [2]=>1 
    } 
    [1]=> 
    array(3) { 
     [0]=>31 
     [1]=>14 
     [2]=>4 
    } 
    [2]=> 
    array(3) { 
     [0]=>3 
     [1]=>18 
     [2]=>1 
    } 

Если [0] и [1] являются одинаковыми, то она также удалить дубликаты, но сложить вместе [2]

Так что привело бы к:

[0]=> 
    array(3) { 
     [0]=>31 
     [1]=>14 
     [2]=>5 
    } 
    [1]=> 
    array(3) { 
     [0]=>3 
     [1]=>18 
     [2]=>1 
    } 
+1

всегда есть 'Еогеасп()' цикл –

+0

Я не понимаю, как значение вычисляется ключ '6'. Разве вы не хотите хранить его в отдельной переменной? – vonUbisch

ответ

1

Попробуйте

$array = [ 
    ... 
]; 

$resultArray = []; 
$length = count($array); 

for ($i = 0; $i < $length; $i++) 
{ 
    if (!array_key_exists($i, $array)) 
    { 
     continue; 
    } 

    $array1 = $array[$i]; 
    $values1 = array_slice($array1, 0, -1); 

    for ($j = $i + 1; $j < $length; $j++) 
    { 
     if (!array_key_exists($j, $array)) 
     { 
      continue; 
     } 

     $array2 = $array[$j]; 
     $values2 = array_slice($array2, 0, -1); 

     if ($values1 == $values2) 
     { 
      $array1[6] += $array2[6]; 

      unset($array[$j]); 
     } 
    } 

    $resultArray[] = $array1; 
} 

var_dump($resultArray); 

или

$resultArray = []; 

for ($i = 0; $i < count($array); $i++) 
{ 
    $array1 = $array[$i]; 
    $values1 = array_slice($array1, 0, -1); 

    $length = count($array); 

    for ($j = $i + 1; $j < $length; $j++) 
    { 
     if (!array_key_exists($j, $array)) 
     { 
      continue; 
     } 

     $array2 = $array[$j]; 
     $values2 = array_slice($array2, 0, -1); 

     if ($values1 == $values2) 
     { 
      $array1[6] += $array2[6]; 

      unset($array[$j]); 
     } 
    } 

    $array = array_values($array); 

    $resultArray[] = $array1; 
} 

var_dump($resultArray); 

или

$resultArray = []; 

for ($i = 0; $i < count($array); $i++) 
{ 
    $array1 = $array[$i]; 
    $values1 = array_slice($array1, 0, -1); 

    for ($j = $i + 1; $j < count($array); $j++) 
    { 
     $array2 = $array[$j]; 
     $values2 = array_slice($array2, 0, -1); 

     if ($values1 == $values2) 
     { 
      $array1[6] += $array2[6]; 

      unset($array[$j]); 

      $j--; 
      $array = array_values($array); 
     } 
    } 

    $resultArray[] = $array1; 
} 

var_dump($resultArray); 

Первое решение должно быть самым быстрым

Я также проверил, что isset($array[$i]) работает намного быстрее, чем arary_key_exists($i, $array)

+0

Это шаг в правильном направлении, однако ваш код не работает полностью, если имеется 6 повторяющихся массивов с [6] = 1, тогда он создает 2 массива из одного из [6] = 4 и одного из [6] = 2. Как и его не полностью зацикливание. –

+1

@ Dr.Banana вы можете показать мне свой массив? –

+0

Я приклеил полный массив здесь http://pastebin.com/NVd1fY5T –

3
$data = // your dataset above 
$result = array(); 

foreach ($data as $keyA => $valueA){ 
    foreach ($data as $keyB => $valueB){ 
     // showing an explicit way of comparing values, eventually you could use php array_diff or array_diff_key functions 
     if ($valueA[0] == $valueB[0] && 
      $valueA[1] == $valueB[1] && 
      $valueA[2] == $valueB[2] && 
      $valueA[3] == $valueB[3] && 
      $valueA[4] == $valueB[4] && 
      $valueA[5] == $valueB[5] && 
      $keyA != $keyB){ 

      $valueA[6] += $valueB[6]; 
      $result[] = $valueA; 
     } 
    } 
} 

var_dump($result); // is now your expected result 

Обновление: как отмечает @vonUbisch, это будет только г esult в дублированных элементах. Не дубликаты будут проигнорированы. Возможно, вы можете объяснить свою конечную цель, эта логика кажется действительно неудобной, и, возможно, другие подходы могут предложить лучшее решение.

Update 2:

Тем не менее, кажется, как не оптимальной логике, но здесь идет

$data = array(
    array(31, 14, 1), 
    array(31, 14, 4), 
    array(3, 18, 1) 
); 

$mutant = array(); 
$result = array(); 

// deconstruct the data set 
foreach ($data as $key => $value){ 
    // use the first values as an 'id' 
    $id = $value[0] . '.' . $value[1]; 

    // now we use that id as a key in the result array 
    if (array_key_exists($id, $mutant)){ 
     // if the key exists (a previous dataset with same values existed), we add the last item 
     $mutant[$id] += $value[2]; 
    }else{ 
     // if the key does not exist, we set the last item 
     $mutant[$id] = $value[2]; 
    } 
} 

var_dump($mutant); 

// array (size=2) 
// '31.14' => int 5 
// '3.18' => int 1 

// now we rebuild it 
foreach ($mutant as $key => $value){ 
    // split the key into original values 
    $items = explode('.', $key); 
    // depending on your data, you might need to iterate over $items here to cast them as ints 
    // push the last value 
    $items[] = $value; 
    // push sub array into result set 
    $result[] = $items; 
} 

var_dump($result); 
// array (size=2) 
// 0 => 
//  array (size=3) 
//  0 => string '31' * note that value is a string! 
//  1 => string '14' (length=2) 
//  2 => int 5 
// 1 => 
//  array (size=3) 
//  0 => string '3' (length=1) 
//  1 => string '18' (length=2) 
//  2 => int 1 
+0

Ваш результат не будет соответствовать его, посмотрите на '' данные '' '' '' '' '', но это может быть совершенно неактуальным. – vonUbisch

+0

Извините, может быть, я не объяснил это должным образом. Я пытаюсь объединить дубликаты вместе, позвольте мне привести простой пример. Я не abel, чтобы использовать комментарии, поэтому я разместил здесь пример: http://pastebin.com/SU5YHuTJ –

+1

@ Dr.Banana проверить второе обновление и сообщить нам, если это соответствует вашим потребностям – Juank