Autor Zpráva
theordinary@volny.cz
Profil *
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 *
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
OK, díky, vyzkouším.. Milan

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: