Autor | Zpráva | ||
---|---|---|---|
Hitman Profil |
#1 · Zasláno: 5. 7. 2017, 21:47:36
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..... 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 |
#2 · Zasláno: 6. 7. 2017, 00:25:33
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 ) ) ) 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 |
#4 · Zasláno: 6. 7. 2017, 19:29:39
1<?php <?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.. 1<?php <?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 * |
#6 · Zasláno: 6. 7. 2017, 22:31:07
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 |
#7 · Zasláno: 7. 7. 2017, 00:08:03
Aha, to jsem netušil že to bude tak jednoduché...díky moc :-)
|
||
Keeehi Profil |
#8 · Zasláno: 7. 7. 2017, 01:05:56
Hitman:
Ano, pokud máš vhodně formátovaná vstupní data, pak je to maličkost. |
||
Časová prodleva: 8 let
|
Toto vlákno je staré, již dlouho do něj nikdo nepřispíval.
Informace a odkazy zde uváděné už nemusejí být aktuální. Nechcete-li řešit zde uvedenou konkrétní otázku, založte si vlastní vlákno, nepište do tohoto. Vložíte-li sem nyní příspěvek, upoutáte pozornost mnoha lidí a někteří z nich si jen kvůli vám přečtou i všechny předcházející příspěvky. Předpokládáte-li, že váš text skutečně bude hodnotný, stiskněte následující tlačítko:
Běda vám, jestli to bude blábol.
0