Autor | Zpráva | ||
---|---|---|---|
theordinary@volny.cz Profil * |
#1 · Zasláno: 15. 5. 2013, 11:59:33
Ahojte,
mám vícerozměrné pole $cena['a']['cena_X'] = '95'; $cena['b']['cena_Y'] = '110'; $cena['c']['cena_Y'] = '80'; $cena['d']['cena_Z'] = '85'; $cena['e']['cena_Z'] = '40'; $cena['f']['cena_Z'] = '55'; Potřeboval bych z tohoto pole u indexů, které jsou stejné (v mém případě [cena_Y] a [cena_Z]) ponechat pouze záznam, kde je hodnota (číslo) nejmenší, tzn. v uvedeném případě by pole bylo zredukováno na $cena['a']['cena_X'] = '95'; $cena['c']['cena_Y'] = '80'; $cena['e']['cena_Z'] = '40'; Nemohu přijíét jak na to, prosím o pomoc. Díky Milan |
||
Meris Profil * |
#2 · Zasláno: 15. 5. 2013, 14:01:38
Ahoj
myslím že by to mohlo fungovat takto: $used_key = array(); foreach ($cena as $sub_key => $sub_values ) { foreach ($sub_values as $key => $value) { if (isset($used_key[$key])) { // stejny index uz byl zadan if ($cena[$used_key[$key]][$key] > $value ) { // cena ulozeneho prvku je vyssi nez cena aktualni - unset unset($cena[$used_key[$key]][$key]); $used_key[$key] = $sub_key; } else { // vetsi je aktualni hodnota - odebereme unset($sub_key][$key]); } } else { // index v poli neni, hodnotu ponechame, a pridame do seznamu indexu $used_key[$key] = $sub_key; } } } mělo by to fungovat ale to nevyzkoušené |
||
Tori Profil |
theordinary@volny.cz:
„mám vícerozměrné pole“ A kde ho vezmete? DB? Pokud ho můžete seřadit podle cen, tak stačí prostě pro každý klíč "cena_něco" ponechat jen první hodnotu: $cena['a']['cena_X'] = '95'; $cena['c']['cena_Y'] = '80'; $cena['b']['cena_Y'] = '110'; $cena['e']['cena_Z'] = '40'; $cena['f']['cena_Z'] = '55'; $cena['d']['cena_Z'] = '85'; $nove = array_filter($cena, function($item) { static $keys = array(); if (isset($keys[key($item)])) return false; $keys[key($item)] = true; // jakákoli neNULLová hodnota return true; }); var_dump($nove); Pokud ne, tak nemá smysl ho v PHP řadit, zbytečně zdlouhavé. Spíš teda jedním průchodem pole $cena, a buď vyhazovat přebytečné prvky (jako v [#2]) nebo ukládat hodnoty pro nové pole: $klice = $min = array(); foreach($cena as $klic => $pole) { $tmp = key($pole); if (!isset($min[$tmp][$tmp]) || $min[$tmp][$tmp] > $pole[$tmp]) { $klice[$tmp] = $klic; $min[$tmp] = array($tmp => current($pole)); } } $nove = array_combine($klice, $min); var_dump($nove); |
||
meiilax Profil |
#4 · Zasláno: 15. 5. 2013, 15:06:34
OK, díky, vyzkouším.. Milan
|
||
Časová prodleva: 11 let
|
0