Обработка массива

Gents

Новичок
Обработка массива

Добрый день, ребята второй день нахожусь в диком ступоре, не могу решить элементарную задачу...
У меня есть массив:
PHP:
array (
[0]=>array([0]="не важно что",[1]="не важно что",[2]="не важно что",[3]="не важно что"),
[1]=>array([0]="Вася",[1]="Петя",[2]="Вася",[3]="Маша"),
[2]=>array([0]="5",[1]="6",[2]="7",[3]="8"));
Задача собственно в следующем:
Мне надо просуммировать повторы, в итоге я должен получить:
Вася: 12
Петя: 6
Маша: 8
Наверное все очень просто, но заклинило меня(
 

vamfirius

Новичок
for($i=0;$i<count($array[1]);$i++)
{
for($y=$i;$y<count($array[1])-1;$y++)
{
if($array[1][$i]==$array[1][$y])
{
$num+=$array[2][$y];
}
}
$name=$array[1][$i];
print<<<h
$name: $num
h;
}

-~{}~ 27.08.10 19:07:

А нее сорь. Ничё так не выйдет.

-~{}~ 27.08.10 19:11:

for($i=0;$i<count($array[1]);$i++)
{
for($y=0;$y<count($array[1]);$y++)
{
if($array[1][$i]==$array[1][$y] and $i != $y)
{
$num+=$array[2][$y];
}
}
$name=$array[1][$i];
print<<<h
$name: $num
h;
}

-~{}~ 27.08.10 19:12:

Вот так должно работать.

-~{}~ 27.08.10 19:27:

for($i=0;$i<count($array[1]);$i++)
{
for($y=0;$y<count($array[1]);$y++)
{
if(strcmp($array[1][$i],$array[1][$y])==0)
{
$num+=$array[2][$y];
}
}
$name=$array[1][$i];
print<<<h
$name: $num</br>
h;
unset($num);
}
Вот так сто пудняк работает, только имена повторяются. Ща ещё подумлю.

-~{}~ 27.08.10 19:32:

for($i=0;$i<count($array[1]);$i++)
{
for($y=0;$y<count($array[1]);$y++)
{
if(strcmp($array[1][$i],$array[1][$y])==0)
{
$num+=$array[2][$y];
}
}
$name=$array[1][$i];
$all[]=<<<h
$name: $num</br>
h;
unset($num);
}
$all=array_unique($all);
foreach($all as $each)
{
echo $each;
}

Во ... от так.
 

tz-lom

Продвинутый новичок
vamfirius говнокодер, не слушай его
почитай о том что делают все эти функции
PHP:
foreach(array_unique(array_values($a[1])) as $name)
{
    $sum = 0;
    foreach(array_keys($a[1],$name) as $key)
    {                                                                                                               
        $sum += $a[2][$key];
    }
    echo "$name: $sum\n";
}
-~{}~ 27.08.10 19:50:

я видимо туповат,но ума не приложу как это можно использовать
 

tz-lom

Продвинутый новичок
Автор оригинала: Sluggard
tz-lom
Для решения этой задачи не нужна ни одна из функций.
Правда?
А не смущает что там ниже код который работает?
может тогда предложишь решение без них?
 

Breeze

goshogun
Команда форума
Партнер клуба
для решения этой задачи достаточно двух штуковин: цикла и [m]isset[/m]
 

Ragazzo

TDD interested
vamfirius
предложил единственно верное и правильное решение ))) шучу)
 

tz-lom

Продвинутый новичок
Breeze, есть хорошее решение и плохое решение,твоё решение -плохое,потому что его тяжелее прочесть,тяжелее понять и оно медленнее

PHP:
<?php
$array = array ( 1=>array(0=>"Вася",1=>"Петя",2=>"Вася",3=>"Маша"),2=>array(0=>"5",1=>"6",2=>"7",3=>"8"));


$time_beg = microtime(true);
for($i=0;$i<count($array[1]);$i++)
{
$num = 0; //Чтобы не сыпался Warning
for($y=0;$y<count($array[1]);$y++)
{
if(strcmp($array[1][$i],$array[1][$y])==0)
{
$num+=$array[2][$y];
}
}
$name=$array[1][$i];
$all[]="$name: $num\n";
unset($num);
}
$all=array_unique($all);
foreach($all as $each)
{
echo $each;
}
$time_end = microtime(true);
echo $time_end-$time_beg,"\n";
$slow = $time_end - $time_beg;

echo "\n\n";
$a = $array;

$time_beg = microtime(true);
foreach(array_unique(array_values($a[1])) as $name) 
{ 
    $sum = 0; 
    foreach(array_keys($a[1],$name) as $key) 
    {                                                                                                                
        $sum += $a[2][$key]; 
    } 
    echo "$name: $sum\n"; 
}
$time_end = microtime(true);
echo $time_end-$time_beg,"\n";

echo 'faster ',$slow/($time_end-$time_beg)," times\n";
Вася: 12
Петя: 6
Маша: 8
0.00012087821960449


Вася: 12
Петя: 6
Маша: 8
2.5033950805664E-5
faster 4.8285714285714 times
 

Фанат

oncle terrible
Команда форума
tz-lom
а есть рассуждения хорошие и плохие.
так вот это твое faster 4.8285714285714 times в данном конкретном случае - чудовищно.
Эта цифра на самом деле абсолютно ничего не значит.
Но ты ее преподносишь как сокрушительный аргумент
 

tz-lom

Продвинутый новичок
*****
моё рассуждение заключено в строке
"твоё решение -плохое,потому что его тяжелее прочесть,тяжелее понять и оно медленнее"

а снизу всего лишь доказательство этого утверждения

эта цифра может действительно ничего не значить,но если набирать статистику то получится что отрабатывает этот код более чем в 4 раза быстрее

и да,это аргумент,вы считаете иначе?
 

Crys

Двинутый новичок
ошибся...

-~{}~ 28.08.10 15:36:

эта цифра может действительно ничего не значить,но если набирать статистику то получится что отрабатывает этот код более чем в 4 раза быстрее
на, тестируй...

Код:
$sum = array();
foreach ($a[1] as $k=>$v) {
	$sum[$v] = !isset($sum[$v])?$a[2][$k]:$sum[$v]+$a[2][$k];
}
foreach ($sum as $k=>$v) {
	echo $k.': '.$v."\n";
}
 

tz-lom

Продвинутый новичок
Crys
а что тут тестировать,одинаково,ибо код по сути одинаковый,а на таком маленьком куске оверхед по памяти скомпенсируется оверхедом по процессору

а если посмотреть на предложенный vamfirius вариант то станет видно что там другой алгоритм
 

Crys

Двинутый новичок
а что тут тестировать,одинаково,ибо код по сути одинаковый,а на таком маленьком куске оверхед по памяти скомпенсируется оверхедом по процессору
Очуметь...
 

Gents

Новичок
Ребята, большое спасибо, помогли)

Не надо только ссориться ;)
 
Сверху