Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Сложение значений 2 мерного массива

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
lawer85
Отправлено: 04 Февраля, 2016 - 21:40:00
Post Id


Частый гость


Покинул форум
Сообщений всего: 189
Дата рег-ции: Янв. 2013  


Помог: 1 раз(а)




Есть массив

PHP:
скопировать код в буфер обмена
  1.  
  2. (
  3.     [0] => Array
  4.         (
  5.             [first_name] => Петр
  6.             [last_name] => Рахимов
  7.             [duration_sum] => 49177
  8.         )
  9.  
  10.     [1] => Array
  11.         (
  12.             [first_name] => Степан
  13.             [last_name] => Кадимов
  14.             [duration_sum] => 38674
  15.         )
  16.  
  17.     [2] => Array
  18.         (
  19.             [first_name] => Степан
  20.             [last_name] => Кадимов
  21.             [duration_sum] => 41302
  22.         )
  23.  
  24.     [3] => Array
  25.         (
  26.             [first_name] => Антон
  27.             [last_name] => Шолохов
  28.             [duration_sum] => 42102
  29.         )
  30.  
  31.     [4] => Array
  32.         (
  33.             [first_name] => Павел
  34.             [last_name] => Евстигнеев
  35.             [duration_sum] => 44956
  36.         )
  37.  
  38.     [5] => Array
  39.         (
  40.             [first_name] => Богдан
  41.             [last_name] => Фасонов
  42.             [duration_sum] => 44612
  43.         )
  44. )
  45.  


Мне нужно получить новый массив, где нет повторяющихся людей, а также вычислить сумму всех значений одинаковых записей, допустим тут 2 записи Степан Кадимов, вот и нужно сделать только одну запись, но с суммой всех [duration_sum]
 
 Top
lawer85
Отправлено: 13 Февраля, 2016 - 22:04:05
Post Id


Частый гость


Покинул форум
Сообщений всего: 189
Дата рег-ции: Янв. 2013  


Помог: 1 раз(а)




На другом ресурсе мне предложили сделать так

PHP:
скопировать код в буфер обмена
  1.  
  2. $t = array();
  3. foreach($new_row as $v){
  4.         $t[$v["first_name"].";".$v["last_name"]] += $v["duration_sum"];
  5. }
  6.  


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

PHP:
скопировать код в буфер обмена
  1.  
  2. (
  3.     [Петр;Рахимов] => 261268
  4.     [Степан;Кадимов] => 250375
  5.     [Антон;Кадимов] => 253036
  6.     [Антон;Анурин] => 163289
  7.     [Антон;Снижко] => 114045
  8.     [Антон;Шолохов] => 262553
  9.     [Богдан;Фасонов] => 479634
  10.     [Павел;Евстигнеев] => 259250
  11.     [Александр;Якушев] => 257492
  12.     [Иван;Фасонов] => 274098
  13.     [Анатолий;Гаглоев] => 261319
  14.     [Богдан;Логинов] => 255451
  15.     [Богдан;Калугин] => 209237
  16.     [Дмитрий;Якшевич] => 261625
  17.     [Леван;Жуков] => 138747
  18.     [Максим;Разинин] => 120982
  19.     [Дмитрий;Снижко] => 240571
  20.     [Платон;Фасонов] => 206451
  21.     [Заурбек;Шукшин] => 281851
  22.     [Тамерлан;Тандилов] => 252923
  23.     [Тамерлан;Фасонов] => 242571
  24.     [Леонард;Калугин] => 259509
  25.     [Анатолий;Разинин] => 290971
  26.     [Анатолий;Сафьянов] => 261764
  27.     [Назар;Шукшин] => 263626
  28.     [Иван;Снижко] => 275067
  29.     [Роланд;Кадимов] => 267700
  30.     [Ярослав;Солжиницин] => 246211
  31.     [Леван;Абаев] => 258048
  32.     [Максим;Никифоров] => 260639
  33. )
  34.  
  35.  
 
 Top
exlant
Отправлено: 13 Февраля, 2016 - 23:18:03
Post Id



Посетитель


Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015  


Помог: 14 раз(а)




а что именно не понятно?
создается пустой массив
проходится циклом по входящему массиву
каждую итерацию создается запись в новом массиве,
где ключ состоит из имени и фамилии входящего массива,
к содержимому которой прибавляется значение из входящего массива,
если имя, фамилия повторяются, то произойдет просто добавление значения из входящего массива к новому
 
 Top
lawer85
Отправлено: 14 Февраля, 2016 - 00:08:51
Post Id


Частый гость


Покинул форум
Сообщений всего: 189
Дата рег-ции: Янв. 2013  


Помог: 1 раз(а)




exlant пишет:
а что именно не понятно?
создается пустой массив
проходится циклом по входящему массиву
каждую итерацию создается запись в новом массиве,
где ключ состоит из имени и фамилии входящего массива,
к содержимому которой прибавляется значение из входящего массива,
если имя, фамилия повторяются, то произойдет просто добавление значения из входящего массива к новому


А это так задуманно что массив автоматом проверяет есть ли уже такие имя и фамилия?
 
 Top
dcc0
Отправлено: 14 Февраля, 2016 - 10:36:38
Post Id


Участник


Покинул форум
Сообщений всего: 1043
Дата рег-ции: Июль 2014  


Помог: 10 раз(а)




Потому что имя и фамилия в новом массиве - это ключ, а ключи в массивах уникальны.

(Отредактировано автором: 14 Февраля, 2016 - 10:36:58)



-----
Март 2021. Бросил программирование
 
 Top
Мелкий Супермодератор
Отправлено: 14 Февраля, 2016 - 11:55:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




lawer85 пишет:
А это так задуманно что массив автоматом проверяет есть ли уже такие имя и фамилия?

Нет, это грубая ошибка, на которую PHP кидает E_NOTICE. Но поскольку это PHP - этот код тоже делает вид, что работает.

Правильно:
PHP:
скопировать код в буфер обмена
  1. foreach($new_row as $v){
  2.     $key = $v["first_name"].";".$v["last_name"];
  3.     if (! isset($t[ $key ])) {
  4.         $t[ $key ] = 0;
  5.     }
  6.     $t[ $key ] += $v["duration_sum"];
  7. }


-----
PostgreSQL DBA
 
 Top
exlant
Отправлено: 14 Февраля, 2016 - 21:54:58
Post Id



Посетитель


Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015  


Помог: 14 раз(а)




PHP:
скопировать код в буфер обмена
  1. foreach($new_row as $v){
  2.     $key = $v["first_name"].";".$v["last_name"];
  3.     if (! isset($t[ $key ])) {
  4.         $t[ $key ] = 0;
  5.     }
  6.     $t[ $key ] += $v["duration_sum"];
  7. }


поддерживаю, так намного правильнее
 
 Top
lawer85
Отправлено: 14 Февраля, 2016 - 23:27:24
Post Id


Частый гость


Покинул форум
Сообщений всего: 189
Дата рег-ции: Янв. 2013  


Помог: 1 раз(а)




Мелкий пишет:
lawer85 пишет:
А это так задуманно что массив автоматом проверяет есть ли уже такие имя и фамилия?

Нет, это грубая ошибка, на которую PHP кидает E_NOTICE. Но поскольку это PHP - этот код тоже делает вид, что работает.

Правильно:
PHP:
скопировать код в буфер обмена
  1. foreach($new_row as $v){
  2.     $key = $v["first_name"].";".$v["last_name"];
  3.     if (! isset($t[ $key ])) {
  4.         $t[ $key ] = 0;
  5.     }
  6.     $t[ $key ] += $v["duration_sum"];
  7. }


По логике этого кода первый ключ будет 0 так выходит. Ведь при первом проходе по циклу $t[$key] еще не существует, т.к. массив $t изначально пустой. А для чего мне в этом массиве ключ 0?
 
 Top
exlant
Отправлено: 14 Февраля, 2016 - 23:36:01
Post Id



Посетитель


Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015  


Помог: 14 раз(а)




1. Нет, ключ будет вот это значение $v["first_name"].";".$v["last_name"]
2. А тут всего будет один проход по циклу
3. Вот как раз при первом проходу мы и создаем $t[$key] и ставим ему значение 0, что бы не было нотисов при команде +=
4. Ну а создав в массиве ячейку с ключом $v["first_name"].";".$v["last_name"] и значением 0,
мы ему прибавляем значение $v["duration_sum"], и это все за одну итерацию.
5. приведенный Мелким код выполняет тоже самое, что и код, который вам дали на другом ресурсе, только он грамотней оформлен, и будет выполняться без нотисов
 
 Top
lawer85
Отправлено: 15 Февраля, 2016 - 01:11:40
Post Id


Частый гость


Покинул форум
Сообщений всего: 189
Дата рег-ции: Янв. 2013  


Помог: 1 раз(а)




exlant пишет:
1. Нет, ключ будет вот это значение $v["first_name"].";".$v["last_name"]
2. А тут всего будет один проход по циклу
3. Вот как раз при первом проходу мы и создаем $t[$key] и ставим ему значение 0, что бы не было нотисов при команде +=
4. Ну а создав в массиве ячейку с ключом $v["first_name"].";".$v["last_name"] и значением 0,
мы ему прибавляем значение $v["duration_sum"], и это все за одну итерацию.
5. приведенный Мелким код выполняет тоже самое, что и код, который вам дали на другом ресурсе, только он грамотней оформлен, и будет выполняться без нотисов


Все понял, спасибо.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB