PHP: группировка массива в цикле for-each

У меня есть такой массив:

array(2) {
  ["currency"]=>
    string(7) "bitcoin"
  ["Totalcs"]=>
   string(1) "1"
}
array(2) {
  ["currency"]=>
    string(8) "ethereum"
  ["Totalcs"]=>
   string(1) "1"
}
array(2) {
  ["currency"]=>
    string(8) "ethereum"
  ["Totalcs"]=>
   string(1) "1"
}

Я хочу сгруппировать этот массив следующим образом:

array(2) {
 ["currency"]=>
   string(7) "bitcoin"
 ["Totalcs"]=>
   string(1) "1"
}
array(2) {
 ["currency"]=>
   string(8) "ethereum"
 ["Totalcs"]=>
   string(1) "2"
 }

Я пробовал много способов, но ни у кого не получилось .... пожалуйста, помогите мне


person Vishnu Gopinath    schedule 16.02.2018    source источник
comment
попробуйте array_unique ($ array, SORT_REGULAR); для получения дополнительной информации посетите php.net/language.operators.array   -  person Sanjit Bhardwaj    schedule 16.02.2018
comment
Пожалуйста, поделитесь попыткой кода, хотя бы одной.   -  person u_mulder    schedule 16.02.2018
comment
Было действительно неясно, пока я не заметил, что вы увеличиваете количество ......, поскольку санджит указал уникальный массив попыток.   -  person Alice    schedule 16.02.2018
comment
Алиса, ага......   -  person Vishnu Gopinath    schedule 16.02.2018
comment
@Irfan, это неподходящая ссылка на дубликат. Суммирования там не происходит. Вероятно, 100 других/лучших ссылок, чтобы найти.   -  person mickmackusa    schedule 16.02.2018
comment
@micmackusa, я предполагаю группировку по функциональности в массиве, поэтому меня отметили, может быть, это неправильно ..   -  person er.irfankhan11    schedule 16.02.2018
comment
@VishnuGopinath, я изменил свое решение, поэтому, пожалуйста, взгляните на текущее отредактированное решение (I HAVE USED isset() INSIDE foreach())   -  person Anant Kumar Singh    schedule 16.02.2018


Ответы (2)


Простой foreach() с созданием нового массива выполнит эту работу: -

$final_array = [];

foreach($array as $arr){

  $final_array[$arr['currency']]['currency'] = $arr['currency'];
  $final_array[$arr['currency']]['Totalcs'] = (isset($final_array[$arr['currency']]['Totalcs']))? $final_array[$arr['currency']]['Totalcs']+$arr['Totalcs'] : $arr['Totalcs'];

}

$final_array = array_values($final_array);

print_r($final_array);

Вывод: - https://eval.in/957322

person Anant Kumar Singh    schedule 16.02.2018

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

Код: (Демо)

$array=[
    ['currency'=>'bitcoin','Totalcs'=>'1'],
    ['currency'=>'ethereum','Totalcs'=>'1'],
    ['currency'=>'ethereum','Totalcs'=>'1']
];
foreach($array as $row){  // iterate all rows
    if(!isset($result[$row['currency']])){  // if first occurrence of currency...
        $result[$row['currency']]=$row;     // save the full row with currency as the temporary key
    }else{                                    // if not the first occurrence of currency...
        $result[$row['currency']]['Totalcs']+=$row['Totalcs'];  // add Totalcs value
    }
}
var_export(array_values($result));

Выход:

array (
  0 => 
  array (
    'currency' => 'bitcoin',
    'Totalcs' => '1',
  ),
  1 => 
  array (
    'currency' => 'ethereum',
    'Totalcs' => 2,
  ),
)
person mickmackusa    schedule 16.02.2018