IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Řazení prvků ve víceúrovňových polích

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Ondřej Pech
Člen
Avatar
Ondřej Pech:18.6.2018 16:52

Ahoj, potřeboval bych zase poradit. Mám v PHP následující pole:

$products = [
        1 => [
                'id' => 456,
                'price' => 1250.5,
        ],
        2 => [
                        'id' => 567,
                        'price' => 1124,
                ],
        ...
        ];

Zkusil jsem: Umím řadit položky v jednoduchém poli $ids = [435, 345, ..] a pod.

Chci docílit: Ale potřeboval bych seřadit pole $products např. podle id ve vnořeném poli, jedno jestli sestupně nebo vzestupně. Potřebuji jen aby položky se stejným ID byly v poli za sebou.

Moc díky za rady :)

 
Odpovědět
18.6.2018 16:52
Avatar
Roman Duchoň:18.6.2018 18:51
array_multisort($products);

docela funguje.
Ale přiznám se, že sám teď pátrám proč. :D

Nahoru Odpovědět
18.6.2018 18:51
RD
Avatar
Roman Duchoň:18.6.2018 19:10

No, ono to asi prostě tak dělá - řadí dle prvního sloupce.
Kdybys chtěl seřadit zase naopak dle ceny, je to složitější:

$arraySortPrice = array();
foreach ($products as $arrayEntry) {
    $arraySortPrice[] = $arrayEntry["price"];
}
array_multisort($arraySortPrice, $products);
print_r($products);

Pokud něco říkám špatné, opravte mě.
Také se učím. :)
(hledal jsem - nejlíp vysvětleno mi to přišlo zde)

Editováno 18.6.2018 19:11
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
18.6.2018 19:10
RD
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Ondřej Pech
Peter Mlich:19.6.2018 7:39

Da se pouzit i usort nebo uasort
php.net/usort

<?php
function cmp($a, $b)
{
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
}

$a = array(3, 2, 5, 6, 1);

usort($a, "cmp");

foreach ($a as $key => $value) {
    echo "$key: $value\n";
}
?>

Podminku si rozsiris na vsechny indexy, podle kterych chces serazovat. Napr

function cmp2(a,b) {
x = cmp(a[0],b[0]); if (x!=0) {return x;};
x = cmp(a[3],b[3]); if (x!=0) {return x;};
}
//usort($a, "cmp");
usort($a, "cmp2");
 
Nahoru Odpovědět
19.6.2018 7:39
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Peter Mlich
Petr Čech:19.6.2018 9:51

To mi pro tohle připadá jako zbytečný overkill

Nahoru Odpovědět
19.6.2018 9:51
the cake is a lie
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Peter Mlich
Petr Čech:19.6.2018 9:57

A také mi připadá nevhodné si znečišťovat si globální prostor tak genericky pojmenovanou funkcí jako cmp, lepší je IMHO udělat ji anonymní, pokud se to hodí, a tady se to zrovna hodí.

$arr = array(3, 2, 5, 6, 1);

usort($arr, function ($a, $b) {
    if ($a == $b) {
        return 0;
    }
    return ($a < $b) ? -1 : 1;
});

foreach ($arr as $key => $value) {
    echo "$key: $value\n";
}
Nahoru Odpovědět
19.6.2018 9:57
the cake is a lie
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:19.6.2018 14:54

Anonymni funkce jsou zlo. Pokud to jde, vyhnout se. Souhlas, ze nazev cmp neni vhodny. Pouzil jsem copy-paste z php.net.

 
Nahoru Odpovědět
19.6.2018 14:54
Avatar
Petr Čech
Tvůrce
Avatar
Odpovídá na Peter Mlich
Petr Čech:19.6.2018 17:41

Rozveď, proč jsou anonymní funkce zlo. Samozřejmě je nechceš mít tak moc jako třeba v JS, ale např. jako argument funkce jsou perfektní.

Nahoru Odpovědět
19.6.2018 17:41
the cake is a lie
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Petr Čech
David Hartinger:19.6.2018 17:57

My je v PHP používáme na registrování cron tasků, je to docela cool :) Samozřejmě se dají ale použít špatně místo obyčejných metod, lidé jsou schopní různých věcí :-`

Nahoru Odpovědět
19.6.2018 17:57
New kid back on the block with a R.I.P
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20.6.2018 8:03

Nevim, co ti k tomu rici. Proste, muj nazor, jsem hluboce presvedceny, ze je to zlo :)
Kdyz je to funkce, melo by to byt napsane mezi funkcemi. Hur se pak v kodu orientuje, ktera zavorka k cemu patri {}(); Jednoducha funkce, budiz, ale uz jsem videl psat i mnohoradkove do nekolika malo radku natlacene prikazy do sebe bez spolecne logiky
Nebo, kdyz treba tech usortu budes pouzivat 5, tak tam 5x pises celou funkci?

Editováno 20.6.2018 8:06
 
Nahoru Odpovědět
20.6.2018 8:03
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 10.