Autor Zpráva
Hitman
Profil
Dobrý večer,

řeším problém s řazením pole:

Array ( [31] => stdClass Object ( [typ0] => škoda octavia [pocet0] => 45 [typ1] => felicie [pocet1] => 64 ) [28] => stdClass Object ( [typ0] => mercedes [pocet0] => 8 [typ1] => felicie [pocet1] => 9 [typ2] => bmw [pocet3]=> 6.....

Základní pole je id řekněme mýtné brány, která počítá projetá auta a já pole potřebuji seřadit od té co jich napočítala nejméně, nezávisle na typu aut.

Čili brána 31>109, 28>23 atd. Pořadí by se tedy změnilo na 28,31.

Takže asi nějaký buble sort, vždy sečíst pocet0, pocet1 atd. a porovnat s dalším id. Jenže vůbec netuším jak ty klíče (id brány) přehodit.

Díky
Keeehi
Profil
Tak rozhodně to bude usort.

A teď k těm objektům - je pěkná prasečina mít atributy pojmenované něcočíslo. Tím se nedá rozumě iterovat. Smysl by dávalo, kdyby každý objekt měl jen dva atributy - typ a počet, brána by měla pole těchto objektů. Pak by to byla pohoda.

Tipuji, že to ti chodí nějaký JSON. Pokud ho generuješ ty tak to prosím úprav, aby se tím dalo lehce iterovat.
Hitman
Profil
Takže správně by to mělo být dvojrozměrné pole?

[id_brany][id_polozky]->objekt s parametry položky?

Např:

Array ( [25] => Array ( [1] => stdClass Object ( [typ] => octavia [pocet] => 5 ) [2] => stdClass Object ( [typ] => felicie [pocet] => 9 ) ) [14] => Array ( [1] => stdClass Object ( [typ] => octavia [pocet] => 5 ) [2] => stdClass Object ( [typ] => trabant [pocet] => 3 ) ) )

Jak by poté vypadala funkce pro funkci usort?

Potřebuje projít všechny vnitřní pole, z nich sečíst všchny "pocet", vzít další, opakovat akci, součty porovnat a buď nechat být, nebo přehodit index (klíč) hlavního pole. Ale vůbec netuším jak vytáhnout všechny objekt "pocet" ze všech "podpolí" a už vůbec ne jak indexy přehodit...
juriad
Profil
<?php

$brany = [25 => [(object) ['typ' => 'octavia', 'pocet' => 5], (object) ['typ' => 'felicie', 'pocet' => 9]],
          14 => [(object) ['typ' => 'octavia', 'pocet' => 5], (object) ['typ' => 'trabant', 'pocet' => 3]]];

uasort($brany, function($v1, $v2) {
    $s1 = 0; # suma poctu prvni brany
    foreach ($v1 as $v) {
        $s1 += $v->pocet;
    }
    $s2 = 0; # suma poctu druhe brany
    foreach ($v2 as $v) {
        $s2 += $v->pocet;
    }
    return $s1 - $s2; # kladne cislo znamena prohodit
});

var_dump($brany);
Hitman
Profil
Díky :-) A v případě že bran bude neomezené množství (stejně jako typů aut, resp. počtů v každé bráně)?

Jak zařídit vstup do té funkce pomocí cyklu?

Předpokládám že něco jako function(foreach($brany as $brana)) nepůjde..
<?php
 
$brany = [25 => [(object) ['typ' => 'octavia', 'pocet' => 5], (object) ['typ' => 'felicie', 'pocet' => 9]],
          14 => [(object) ['typ' => 'octavia', 'pocet' => 5], (object) ['typ' => 'trabant', 'pocet' => 3], (object) ['typ' => 'bmw', 'pocet' => 8]],
          32 => [(object) ['typ' => 'felicie', 'pocet' => 4], (object) ['typ' => 'trabant', 'pocet' => 12]]];

?>
juriad_
Profil *
Ta moje ukazka funguje s libovolnym poctem bran. Uasort zavola tu porovnavaci funkci pro nektere dvojice bran (trochu chytreji nez to dela vzpomenuty BubbleSort). Vysledkem je serazeni vsech bran.
Hitman
Profil
Aha, to jsem netušil že to bude tak jednoduché...díky moc :-)
Keeehi
Profil
Hitman:
Ano, pokud máš vhodně formátovaná vstupní data, pak je to maličkost.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: