Сумма значений массива на основе другого значения

#php #arrays

#php #массивы

Вопрос:

Ну, у меня есть этот массив $city :

 Array
(
    [0] => Array
        (
            [0] => fr
            [1] => paris
            [2] => FR-J
            [3] => 0
            [4] => 116729
            [5] => 0
            [6] => 0
        )

    [1] => Array
        (
            [0] => fr
            [1] => marseille
            [2] => FR-U
            [3] => 0
            [4] => 12898
            [5] => 0
            [6] => 0
        )

    [2] => Array
        (
            [0] => fr
            [1] => lyon
            [2] => FR-V
            [3] => 0
            [4] => 8608
            [5] => 0
            [6] => 0
        )

    [3] => Array
        (
            [0] => fr
            [1] => nice
            [2] => FR-U
            [3] => 0
            [4] => 6838
            [5] => 0
            [6] => 0
        )
  

И так далее … И я хотел бы суммировать $city [$key] [4] и генерировать что-то вроде этого:

  Array
(
    [0] => Array
        (
            [0] => FR-J
            [1] => 116729

        )

    [1] => Array
        (
            [0] => FR-U
            [1] => 19736
        )

    [2] => Array
        (
            [0] => FR-V
            [1] => 8608
        )
  

Вот как я пытаюсь это сделать :

 $totals = array();
    foreach ($city as $key => $value) {
        if (isset($city[$key][3])){
            $totals[$key][0] = $city[$key][2];
            $totals[$key][1]  = (int) $city[$key][4]; \ <-- this line
        } else {
            $totals[$key][0] = $city[$key][2];
            $totals[$key][1] = (int) $city[$key][4];
        }
    }
  

Но вместо этого он генерирует этот массив, но с суммами и Undefined offset: 1 в прокомментированной строке. Как я могу это сделать? Очень признателен.

Комментарии:

1. измените отмеченную строку следующим образом: if(!isset($ totals[$key][1])) $totals[$key][1] = 0; $totals[$key][1] = (int) $city[$key][4];

2. $city[$key][4]; должно быть $city[$key][3]; потому, что индекс массива начинается с 0

Ответ №1:

 $sum = [];

foreach($city as $value) {
    if(!isset($sum[$value[2]]))
        $sum[$value[2]] = 0;

    $sum[$value[2]]  = $value[4];
}

$results = [];

foreach($sum as $key => $value)
    $results[] = [$key,$value];

print_r($results);
  

Комментарии:

1. Извините, это не совсем работает! Можете ли вы предоставить codepad или онлайн-тестер?

Ответ №2:

Почему бы вам сначала не установить его, инициализировать его нулем. Чтобы у вас не было неопределенных ошибок индекса. Рассмотрим этот пример:

 $new_values = array();
foreach($original_values as $key => $value) {
    if(!isset($new_values[$value[2]][1])) $new_values[$value[2]][1] = 0;
    $new_values[$value[2]][0] = $value[2];
    $new_values[$value[2]][1]  = $value[4];
}

$new_values = array_values($new_values);
  

Ответ №3:

Это решит вашу проблему.

 $new_values = array();
foreach($original_values as $key => $value) {
      if(false == isset($new_values[$value[2]][1])) {
             $new_values[$value[2]][1] = 0;
       }

      $new_values[$value[2]][0] = $value[2];
      $new_values[$value[2]][1]  = $value[4];
}
  

$new_values = array_values($new_values);

Также используйте скобки в операторе if, это лучшая практика в нашем сообществе.

Ответ №4:

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

 $totals = array();
foreach ($city as $key => $value) {
    $totals[$key][0] = $city[$key][2];
    if(!isset($totals[$key][1])) 
        $totals[$key][1] = 0;
    $totals[$key][1]  = (int) $city[$key][4]; 
}
  

Комментарии:

1. Хотя этот блок кода может ответить на вопрос, было бы лучше, если бы вы могли дать небольшое объяснение, почему он это делает.

2. Определенное по умолчанию смещение 1 означает, что в вашем массиве $total нет элемента с [$key][1] . Вы пытаетесь добавить число к элементу, который не существует. Итак, в моем примере я создаю этот элемент и инициирую с 0 в случае, если он не существует.