foreach() не понимаю....

chulim

Новичок
foreach() не понимаю....

Объясните тупому.
Нужно обойти массив таким образом.
Если классы совпадают, то выбрать тот у которого наибольший номер версии
Вот рабочий пример.
PHP:
<?
$a[1] = array (1, 1); //продукт 1, класс 1, версия 1

$a[2] = array (2, 1);//продукт 2, класс 2, версия 1
$a[3] = array (2, 2);//....
$a[4] = array (2, 3);

$a[5] = array (3, 1);
$a[6] = array (3, 2);
$a[7] = array (3, 3);
$a[8] = array (3, 4);
$a[9] = array (3, 5);

foreach ($a as $_) $b[$_[0]] = $_[1];// В этом месте не совсем ясно, как выбираются нужные элементы.

$i=1;
$a = array ();

foreach ($b as $_1 => $_2)
{
    print "продукт $i, класс $_1, версия $_2<br>";

    $a[$i] = array ($_1, $_2);
    $i++;

}
?>
Спасибо.
 

Demiurg

Guest
похоже тот, кто это писал увлекается перлом. тебе надо получить массив из всех классов с максимальными версиями ?
 

Altex

Новичок
foreach ($a as $_) $b[$_[0]] = $_[1];// В этом месте не совсем ясно, как выбираются нужные элементы.
array (1, 1);
array (2, 1)
array (2, 2);
array (2, 3);

array (3, 1);
array (3, 2);
array (3, 3);
array (3, 4);
array (3, 5);
---------------
из двухмерного в том месте делается одномерный массив, таким причем образом - что индекс каждого элемента - это первое число, а значение его - это второе число , причем записывается не максимальное а все подряд, заменяя друг друга (если индексы одинаковые), и остается таким образом последнее число, которе случайно получается максимальным, (а может не совсем случайно, но в общем случае так)
---------
array (1, 1); - записывается b[1]=1
array (2, 1) -- b[2]=1
array (2, 2); -- перезаписывается -- b[2]=2
array (2, 3); b[2]=3

array (3, 1); и т.д.
array (3, 2);
array (3, 3);
array (3, 4);
array (3, 5);
---------------
 

chulim

Новичок
В итоге хотелось получить массив, где $i есть индекс из исходного массива $a.
если подправить
PHP:
foreach ($a as $i=>$_) $b[$_[0]] = $_[1];// В этом месте не совсем ясно, как выбираются нужные элементы. 

$a = array (); 

foreach ($b as $_1 => $_2) 
{ 
    print "продукт $i, класс $_1, версия $_2<br>"; 

    $a[$i] = array ($_1, $_2); 

}
То индекс выбирается только последний. Почему?
 

fixxxer

К.О.
Партнер клуба
PHP - это не перл.
Неявно не происходит ничего.
Так что напиши по человечески.
С присваиванием переменным значений везде, где это нужно.

И выбрось свои $_, чтобы читать это все можно было.
 

Demiurg

Guest
chulim, подумай, как бы ты все делал сам и у тебя получится алгоритм. Если не понятно как именно работает forech, то смотри [m]foreach[/m] там с примерами и комментариями. Здесь лучше описать не возможно.
 

chulim

Новичок
Спасибо всем.
Будем читать. Вечером постараюсь выложить, то что накропаю. :)
 

chulim

Новичок
Если не получается грызть гранит науки, то пососите его :)

Вот высосал :) Покритикуйте плз.
PHP:
function multisort($m_a, $m_b)
{
if($m_a[1] == $m_b[1]) return 0;
return($m_a[1] < $m_b[1]) ? -1 : 1;
}

$a[1] = array (1, 1);

$a[2] = array (2, 1);
$a[3] = array (2, 2);
$a[4] = array (2, 3);

$a[5] = array (3, 1);
$a[6] = array (3, 2);
$a[7] = array (3, 3);
$a[8] = array (3, 4);
$a[9] = array (3, 5);

uasort($a, multisort); //сортировка по версиям

$b=array();
foreach($a as $id=>$param)
{
if($b == NULL)
   {
   $b[$id]=$param;
   }
else
    {

    foreach($b as $id_1=>$param_1)
            {

            if($param[0] == $param_1[0] && $param_1[1] < $param[1])
               {
                unset($b[$id_1]);
                $b[$id]=$param;
               }
               else
               {$b[$id]=$param;}
            }
    }

}
print_r($b);
?>
Спасибо.
 

lucas

Guest
PHP:
$products = array(
	1 => array(1,1),
	2 => array(2,1),
	3 => array(2,2),
	4 => array(2,3),
	5 => array(3,1),
	6 => array(3,2),
	7 => array(3,3),
	8 => array(3,4),
	9 => array(3,5)
) ;

$new_products = array() ; foreach ($products as $id => $data)
{	if (isset($new_products[$data[0]]) == false || $new_products[$data[0]][1] < $data[1])
	{ $new_products[$data[0]] = array($id,$data[1]) ; }
}

$products = array() ; foreach ($new_products as $class => $data)
{ $products[$data[0]] = array($class,$data[1]) ; }

print_r($products) ;
 

Altex

Новичок
lucas
С дуба рухнул? :) Я ничего не освещал - я написал что у него там уже делается :)) ему же, он же это вроде спрашивал.
 

lucas

Guest
Altex
записывается не максимальное а все подряд, заменяя друг друга (если индексы одинаковые), и остается таким образом последнее число, которе случайно получается максимальным, (а может не совсем случайно, но в общем случае так)
Прошу прощения -- невнимательность. Мне казалось, что процитированное -- описание алгоритма.
 

Altex

Новичок
вот я и пытался человеку сказать что это "не наш метод" (C) =)))
 

chulim

Новичок
lucas
Спасибо, лаконичнее :) . Есть к чему стремиться.

Altex
Алгоритм вначале поста не мой конечно. Спасибо за толкование. Не мог понять что перезаписываются.
 
Сверху