Halloweenská akce! Na stránce s dobitím bodů zadej dole kód STRASIDELNYCH20 a získej porci +20% bodů zdarma!
Akce končí 31.10. o půlnoci.

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

PHP PHP Řazení prvků ve víceúrovňových polích American English version English version

Aktivity (1)
Avatar
Ondřej Pech
Člen
Avatar
Ondřej Pech:18. června 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. června 16:52
Avatar
Roman Duchoň:18. června 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. června 18:51
RD
Avatar
Roman Duchoň:18. června 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. června 19:11
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět 18. června 19:10
RD
Avatar
Peter Mlich
Člen
Avatar
Odpovídá na Ondřej Pech
Peter Mlich:19. června 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  +2 19. června 7:39
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na Peter Mlich
Petr Čech:19. června 9:51

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

Nahoru Odpovědět 19. června 9:51
the cake is a lie
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na Peter Mlich
Petr Čech:19. června 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  +2 19. června 9:57
the cake is a lie
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:19. června 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. června 14:54
Avatar
Petr Čech
Redaktor
Avatar
Odpovídá na Peter Mlich
Petr Čech:19. června 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  +1 19. června 17:41
the cake is a lie
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Petr Čech
David Čápka:19. června 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  +2 19. června 17:57
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:20. června 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. června 8:06
 
Nahoru Odpovědět 20. června 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.