многоразмерные массивы, удаление повт. элементов..

trompert

Guest
многоразмерные массивы, удаление повт. элементов..

ничего не понимаю к концу дня...
есть массив $massiv = array(array("1", "2", "3"), array ("2", "3", "1"), array("2", "3", "5")).
как проще написать функцию для удаления $massiv[$i] если $massiv[$i][0]&&$massiv[$i][1] уже есть в массиве и просуммировать $massiv[$i][2] перед удалением?
 

Georgy

Guest
могу тебе предложить JS сортировщик, по образу и подобию можно и php-sort налабать....
PHP:
	var tmp = new Array(  );
	
	x = 0;
	s = '';
	
	for( i = 0; i < city_id.length; i ++ )
	{
		if ( city_id[i] == 0 )
		{
			initMerch( the_form, 'selectMerch', client_id );
			return false;
		}

		if ( typeof merch[client_id][city_id[i]] != 'undefined' )
		{

			cur_city_id = city_id[i];
			cur_merch_len = merch[client_id][city_id[i]].length;

			for( j = 0; j < cur_merch_len; j ++ )
			{
				cur_merch_id = merch[client_id][cur_city_id][j].value;

				if ( tmp.length == 0 )
				{
					tmp[x] = new Option( merch[client_id][cur_city_id][j].text, merch[client_id][city_id[i]][j].value );
					x ++;
				}
				else
				{
					flag = true;
					for( k = 0; k < tmp.length; k ++ )
					{
						if ( cur_merch_id == tmp[k].value )
						{
							flag = false;
							break;
						}
					}
					
					if ( flag == true )
					{
						tmp[x] = new Option( merch[client_id][city_id[i]][j].text, merch[client_id][city_id[i]][j].value )
						x ++;
					}
				}
			}
		}
		else
		{
			initMerch( the_form, change_object, client_id );
			return false;
		}				
	}
 

trompert

Guest
мама... я не хочу такой писать... неужели покороче невозможно?
 

Georgy

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

[m]array_[/m]*
 

Georgy

Guest
инициализируешь пустой массив
короче идешь по корневому массиву, вотом по вложеному, и во вложеном цикле проверяешь пуст ли "пустой массив" - если да, то суеш в него значение вложеного массива,

если же нет, то пускаешь цикл по "пустому" массиву и проверяешь на совпадение элементы "пустого" и текущего вложеного массива, если есть уже элемент в "пустом массиве, делаешь флаг = false, и останавливаешь цикл, если нет, флаг = true,

далее:

если флаг =true - помещаешь элемент в "пустой массив"

P.S.

надеюсь не совсем бред.
 

trompert

Guest
замечательно, спасибо. буду пытаться так.
 

trompert

Guest
как же просто все оказалось на самом деле.. :))
PHP:
function kill_doubles($zakup){
$i=0;
while ($i<count($zakup)) {
$t=0;
while ($t<count($zakup)) {
if (($zakup[$i][0]==$zakup[$t][0]) and ($zakup[$i][1]==$zakup[$t][1]) and ($i!=$t)){
$zakup[$i][2]=$zakup[$i][2]+$zakup[$t][2];
unset ($zakup[$t]);
}
++$t;
}
++$i;
}
return $zakup;
}
 

.des.

Поставил пиво кому надо ;-)
угу как все просто и как все неправильно :)
пробовал запускать ты свою функцию при E_ALL? и второе задумывался ли ты сколько раз будет исполняться код в цикле?
К сравнению ...
PHP:
for($i=0, $c=sizeof($a); $i<$c; $i++) {
	if( isset($na[$a[$i][0]][$a[$i][1]]) )
		$na[$a[$i][0]][$a[$i][1]] +=$a[$i][2];
	else
		$na[$a[$i][0]][$a[$i][1]] = $a[$i][2];
}
unset($a);

foreach($na as $e1=>$v) {
	foreach($v as $e2=>$sum) {
		$a[]=array($e1,$e2,$sum);
	}
}
А вообще придумываем GROUP BY ? :D

Любителям неправильного программирования первый цикл можно заменить следующей конструкцией.
PHP:
for($i=0, $c=sizeof($a); $i<$c; $i++)
	@$na[$a[$i][0]][$a[$i][1]] +=$a[$i][2];
 

trompert

Guest
эхх... еще учиться и учиться...
хотя e_all все равно отзывается мертвой тишиной. :)
 

.des.

Поставил пиво кому надо ;-)
:D
ну ну
PHP:
$a = array(
	array(1,2,3),
	array(1,2,3),
	array(1,2,3)
);
$a = kill_doubles($a);
Что выведет?
 

trompert

Guest
Да, выводится...
Undefined offset: 1 in /i.php on line 8..
неправильно как-то.. :)
 
Сверху