2016-09-01 3 views
2

У меня есть массив с некоторым значением ID, как показано ниже.Как суммировать значение массива для повторяющихся данных

[ 
    {"ID":"126871","total":"200.00","currency":"USD","name":"John"}, 
    {"ID":"126872","total":"2000.00","currency":"Euro","name":"John"}, 
    {"ID":"126872","total":"1000.00","currency":"Euro","name":"John"}, 
    {"ID":"126872","total":"500.00","currency":"USD","name":"John"}, 
    {"ID":"126872","total":"1000.00","currency":"Euro","name":"John"}, 
] 

Если значение ID является дубликатом, просуммировать общую стоимость одного и того же currency. Для разных currency того же ID, не нужно суммировать total.

Вот что я хочу.

[ 
    {"ID":"126871","total":"200.00","currency":"USD","name":"John"}, 
    {"ID":"126872","total":"4000.00","currency":"Euro","name":"John"}, 
    {"ID":"126872","total":"500.00","currency":"USD","name":"John"} 
] 

Я застрял в вышеуказанной проблеме. Я уже пробовал как можно больше. Но я получил неправильный результат. Я очень благодарен за любые советы.

+0

Похоже JS массив объектов. – hsz

+0

_ «Я уже пробовал столько, сколько смогу». - Ну, поделитесь тем, что вы пробовали с нами, и мы сможем помочь. Мы не будем делать всю работу за вас. –

ответ

2

@Cloud Я сделал функцию для вашего требования и спасибо @M. I. для изучения этого раздела.

$array = array(
    array("ID" => "126871","total"=>"200.00","currency"=>"USD","name"=>"John"), 
    array("ID" => "126872","total"=>"2000.00","currency"=>"Euro","name"=>"John"), 
    array("ID" => "126872","total"=>"1000.00","currency"=>"Euro","name"=>"John"), 
    array("ID" => "126872","total"=>"500.00","currency"=>"USD","name"=>"John"), 
    array("ID" => "126872","total"=>"1000.00","currency"=>"Euro","name"=>"John"), 
); 
echo "<pre>"; 
print_r($array); 

function unique_multidim_array($array, $key,$key1,$addedKey) { 
    $temp_array = array(); 
    $i = 0; 
    $key_array = array(); 
    $key1_array = array(); 

    foreach($array as $val) { 
     if (!in_array($val[$key], $key_array) && !in_array($val[$key1], $key1_array)) { 
      $key_array[$i] = $val[$key]; 
      $key1_array[$i] = $val[$key1]; 
      $temp_array[$i] = $val; 
     }else{ 
      $pkey = array_search($val[$key],$key_array); 
      $pkey1 = array_search($val[$key1],$key1_array); 
      if($pkey==$pkey1){ 
       $temp_array[$pkey][$addedKey] += $val[$addedKey]; 
      }else{ 
       $key_array[$i] = $val[$key]; 
       $key1_array[$i] = $val[$key1]; 
       $temp_array[$i] = $val; 
      } 
      // die; 
     } 
     $i++; 
    } 
    return $temp_array; 
} 

$nArray = unique_multidim_array($array,"ID","currency","total"); 
// die; 
print_r($nArray); 
die; 
+0

Я тоже пытаюсь решить эту проблему, проверил вашу функцию с помощью json и не работал правильно. Вы забыли проверить валюту. Но вы близки к решению этого, ближе чем я :( –

+1

Gongratz !!! Хорошая работа! Вы заслуживаете больших пальцев :). –

+0

Большое спасибо @Manish :). Я долго задерживался. Я очень ценю это. – Cloud

1

@Cloud Попробуйте это.

$array = array(array("ID" => "126871","total"=>"200.00","currency"=>"USD","name"=>"John",),array("ID" => "126871","total"=>"200.00","currency"=>"USD","name"=>"John",),array("ID" => "126872","total"=>"1000.00","currency"=>"Euro","name"=>"John",)); 
    echo "<pre>"; 
    print_r($array); 
    $unique = array_map('unserialize', array_unique(array_map('serialize', $array))); 

Sure @Magnus Eriksson. Я объясняю, почему мы используем «Serialize» и «десериализации» пошагово:

Шаг 1: Преобразование многомерный массив в одномерный массив

Чтобы преобразовать многомерный массив в одномерный массив, сначала генерируйте представление потока байтов всех элементов (включая вложенные массивы) внутри массива. Функция serialize() может генерировать представление байтового потока значения. Для генерации представления байтового потока всех элементов вызовите функцию serialize() внутри функции array_map() как функцию обратного вызова. Результатом будет одномерный массив независимо от того, сколько уровней имеет многомерный массив.

Шаг 2: Сделайте значение уникального

Чтобы сделать это один одномерный массив уникальным, используйте array_unique() функцию.

Шаг 3: Откат его в многомерный массив

Хотя массив теперь уникален, значение выглядит представление потока байт. Чтобы вернуть его обратно в многомерный массив, используйте функцию unserialize().

Надеюсь, теперь, почему я делаю этот код.

+0

Я мог бы не понимать 'array_map' так же хорошо, как я думал, но где же' unserialize' и 'serialize' вписываются? Вы действительно должны объяснить, что на самом деле делает код, а не просто опубликовать фрагмент случайного кода. –

+0

Я думаю, что OP хочет суммировать «общее» поле для строк с одним и тем же идентификатором. Я думаю, что для этого нужно немного больше разбора :( –

0

Что: Создайте массив, который сгруппирован по 'ID' и 'Currency'. Накопите валюту для дубликатов.

Как:

  • Добавление строк по одному в выходной массив.
  • Если группа не находится в массиве, добавьте ее
  • Если она находится в массиве, добавьте валюту в существующую запись.

Demonstration at eval.in

Код:

/** ---------------------------------------------- 
* Create an output array one row at a time. 
* 
* Group by Id and currency. 
* 
* @param array $groups 
* 
* @return array 
*/ 
function getCurrencyGroups(array $groups) 
{ 
    $currencyGroups = array(); 

    foreach ($groups as $item) { 

     $id  = $item['ID']; 
     $currency = $item['currency']; 
     $amount = $item['total']; 

     if (!isset($currencyGroups[$id][$currency])) { 
      $currencyGroups[$id][$currency] = $amount; 
     } 
     else { 
      $currencyGroups[$id][$currency] += $amount; 
     } 
    } 

    return $currencyGroups; 
} 

Выполнить это:

$currencyGroups = getCurrencyGroups($source); 

Выход:

array (size=2) 
    126871 => 
    array (size=1) 
     'USD' => string '200.00' (length=6) 

    126872 => 
    array (size=2) 
     'Euro' => float 4000 
     'USD' => string '500.00' (length=6) 
0

Вы будете п eed to:

  • Преобразуйте строку json в php-массив с помощью json_decode.
  • Прокрутите строки и сгруппируйте их, используя сложные временные ключи. Другими словами, генерируйте одну строку из значений каждой строки ID & currency и используйте эту строку в качестве временного уникального ключа.
  • Суммировать значения total сгруппированных строк.
  • Затем подготовьте выходной массив для его возврата в json путем переиндексации строк и вызова json_encode().

Код: (Demo)

$json='[ 
    {"ID":"126871","total":"200.00","currency":"USD","name":"John"}, 
    {"ID":"126872","total":"2000.00","currency":"Euro","name":"John"}, 
    {"ID":"126872","total":"1000.00","currency":"Euro","name":"John"}, 
    {"ID":"126872","total":"500.00","currency":"USD","name":"John"}, 
    {"ID":"126872","total":"1000.00","currency":"Euro","name":"John"} 
]'; 

$array=json_decode($json,true); // convert to array 
foreach($array as $row){ 
    if(!isset($result[$row['ID'].$row['currency']])){ 
     $result[$row['ID'].$row['currency']]=$row; // on first occurrence, store the full row 
    }else{ 
     $result[$row['ID'].$row['currency']]['total']+=$row['total']; // after first occurrence, add current total to stored total 
    } 
} 
$result=json_encode(array_values($result)); // reindex the array and convert to json 
echo $result; // display 

Выход:

[ 
    {"ID":"126871","total":"200.00","currency":"USD","name":"John"}, 
    {"ID":"126872","total":4000,"currency":"Euro","name":"John"}, 
    {"ID":"126872","total":"500.00","currency":"USD","name":"John"} 
] 
+0

@Cloud Я не знаю, почему Маниш собирает столько хлопот за простую/рутинную задачу. См. Мой ответ для про-способ сделать это. – mickmackusa

Смежные вопросы