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 :: Сложение повторяющихся элементов массива

 PHP.SU

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


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

> Без описания
Tox
Отправлено: 06 Августа, 2012 - 15:58:56
Post Id



Посетитель


Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011  
Откуда: Россия


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




Я писал этот скрипт с 10.00 до 16.53. Далее мои мозги перешли в режим off, простите за нубство, подскажите, как сделать.
Есть большой многомерный массив, в нем могут быть повторяющиеся айди юзеров:
CODE (htmlphp):
скопировать код в буфер обмена
  1. (
  2.     [0] => Array
  3.         (
  4.             [id] => User_id_1
  5.             [name] => UserName1
  6.             [Option0] => 0.14
  7.             [Option1] => 0.12
  8.             [Option1] => 9
  9.             [Option1] => 0.75
  10.             [Option1] => 21.39
  11.             [Option1] => 24.76
  12.             [Option1] => 1.42
  13.             [Option1] => 3.74
  14.             [Option1] => 154.07
  15.             [Option1] => 1.58
  16.             [Option1] => 1.35
  17.         )
  18.  
  19.     [1] => Array
  20.          (
  21.             [id] => User_id_1
  22.             [name] => UserName2
  23.             [Option0] => 0.14
  24.             [Option1] => 0.13
  25.             [Option2] => 10
  26.             [Option3] => 0.76
  27.             [Option4] => 21.40
  28.             [Option5] => 24.77
  29.             [Option6] => 1.43
  30.             [Option7] => 3.75
  31.             [Option8] => 154.08
  32.             [Option9] => 1.59
  33.             [Option10] => 1.36
  34.         )
  35. )

Надо:
если id одинаковые, то "соединить" [0] и [1] (например) в [0], все Option - сложить, а юзерНейм - оставить любой.
Спасибо
(Добавление)
Мне тут пришла идея - записывать в дополнительный массив значения id и номер массива, в котором оно находится:
Array
CODE (htmlphp):
скопировать код в буфер обмена
  1. (
  2.     [0] => User_id_1
  3.     [1] => User_id_1
  4.     [2] => User_id_2
  5.     [3] => User_id_2
  6. )

Это как пример, могут ведь быть повторяющиеся значения. По сути - User_id_1 - это объект(Не ООП), а индекс - ссылка. То есть мы точно знаем, в какой "части" многомерного массива находится нужный User_id.
Далее все ясно - можно перебором брать нужный id, делать поиск, брать нужный индекс. И тогда мы точно знаем, что, например, User_id_1 будет встречаться в индексах 1, 10, 20 и тд (например). А потом уже складывать значения, ссылки ведь уже есть.
Вот я только юзаю array_search, а он доходит до первого совпадения, а дальше нет.
То есть в примере выше array_search вернет 0, а не 0 и 1.
Я вообще на верном пути и есть ли аналог array_search? in_array не подходит и иные в "см. также"

(Отредактировано автором: 06 Августа, 2012 - 16:02:08)



-----
In Console We Trust. Code hard. Or die.
 
 Top
EuGen Администратор
Отправлено: 06 Августа, 2012 - 18:01:48
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


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




PHP:
скопировать код в буфер обмена
  1. $rgData=array(
  2.    array(
  3.    'id'      => 19,
  4.    'name'    => 'Rogov Vasiliy',
  5.    'Option0' => 0.36,
  6.    'Option1' => 0.55,
  7.    'Option2' => 1.43
  8.    ),
  9.    array(
  10.    'id'      => 11,
  11.    'name'    => 'Vasserman Anatoly',
  12.    'Option0' => 1.65,
  13.    'Option1' => 2.21
  14.    ),
  15.    array(
  16.    'id'      => 19,
  17.    'name'    => 'Willson Jay',
  18.    'Option0' => 3,
  19.    'Option1' => 0.1,
  20.    'Option2' => 2.05,
  21.    'Option3' => 1.15
  22.    ),
  23. );
  24.  
  25. function sumByColumn($rgData, $sColumn)
  26. {
  27.    $rgIndex = array();
  28.    $rgResult= array();
  29.    array_walk($rgData, function($rgValue, $iIndex) use (&$rgIndex, $sColumn)
  30.    {
  31.       $rgIndex[$rgValue[$sColumn]][]=$iIndex;
  32.    });
  33.    array_walk($rgIndex, function($rgValue) use (&$rgData, &$rgResult, $sColumn)
  34.    {
  35.       $rgTemp = array();
  36.       foreach($rgValue as $iIndex)
  37.       {
  38.          foreach($rgData[$iIndex] as $sKey=>$mValue)
  39.          {
  40.             $rgTemp[$sKey]=($sColumn!=$sKey && is_numeric($mValue))?$rgTemp[$sKey]+$mValue:$mValue;
  41.          }
  42.       };
  43.       $rgResult[]=$rgTemp;
  44.    });
  45.    return $rgResult;
  46. }
  47.  
  48. $rgResult = sumByColumn($rgData, 'id');
  49. //var_dump($rgResult);
  50.  

?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Tox
Отправлено: 06 Августа, 2012 - 18:59:05
Post Id



Посетитель


Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011  
Откуда: Россия


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




Если в
PHP:
скопировать код в буфер обмена
  1. $rgResult = sumByColumn($rgData, 'id');

вместо id поставить 19, то Notice: Undefined index: Option0-3
Так и должно быть?
(Добавление)
Все, понял. Спасибо огромное, я бы так красиво не написал бы Улыбка
Точнее мне даже стыдно кидать сюда свой исходник

(Отредактировано автором: 06 Августа, 2012 - 19:18:56)



-----
In Console We Trust. Code hard. Or die.
 
 Top
Tox
Отправлено: 07 Августа, 2012 - 19:42:54
Post Id



Посетитель


Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011  
Откуда: Россия


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




А можно еще, если id одинаковые, то создать в общей записи (в которую соединили) индекс Option4, которое содержит количество повторений, то есть, по примеру, сколько раз повторялся массив в id=19


-----
In Console We Trust. Code hard. Or die.
 
 Top
kroko
Отправлено: 13 Сентября, 2012 - 10:37:53
Post Id


Новичок


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


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




Tox, подскажите пожалуйста как убрать "Notice: Undefined index: Option0-3"
Спасибо.
 
 Top
Tox
Отправлено: 14 Сентября, 2012 - 22:54:30
Post Id



Посетитель


Покинул форум
Сообщений всего: 314
Дата рег-ции: Нояб. 2011  
Откуда: Россия


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




kroko
Боюсь уже не вспомню. Но как-то можно Улыбка


-----
In Console We Trust. Code hard. Or die.
 
 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