Ulozisko dat v poli rubrika: Programování: PHP

4 mario2402
položil/-a 8.12.2017

Ahojte,

nevie ma niekto nakupnut spravnym smerom ako urobit nieco taketo:

Mam pole:

$cesta = [ 'cesta' , 'ku' , 'datam' ]; // moze byt rozny pocet hodnot
 
$data = 'nejake data';
 
function setData($cesta , $data) {
 ...
 $pole['cesta']['ku']['datam'] = $data;
 ...
}
 
function getData($cesta) {
 ...
 return $pole['cesta']['ku']['datam'];
 ...
}

Momentalne to riesim tak, ze si spocitam kolko hodnot je v $cesta a idem:

if ($pocet == 1) {
 
 $pole['cesta'];
 
}
elseif ($pocet == 2) {
 
 $pole['cesta']['ku'];
 
}
// atd

co nevyzera ani dobre, a ani neriesi rozny pocet hodnot ktore mozu byt v $cesta..

absolutne nic ma nenapada, ako toto vyriesit :(

Kod uz nezmenim (musel by som prekopat komplet aplikaciu) :(

Komentáře

  • rmaslo : PS: Asi jsem to napoprvně pochopil úplně blbě. Ty data jsou fakt v tom poli a to cesta k datům není cesta k souboru, že jo? 9.12.2017
  • mario2402 : V $pole je rekurzivne pole, do ktoreho moze aplikacia pridavat dalsie hodnoty, moze z neho hodnoty vyberat, overovat ci existuju, mazat ich. V skutocnosti sa data vyberaju nejak takto: get('cesta.ku.datam'), pridavaju set('cesta.ku.datam', 'hodnota') ale aj set('cesta.ku', ['datam'=>'hodnota'] , co je to iste. $data moze byt kludne dalsie rekurzivne pole. Bodka oznacuje hlbku rekurzie, a v priklade dotazu som to chcel len zjednodusit (kedze by sa aj tak urcite postupovalo cez explode('.', $cesta) ) . Cize to co je v priklade, tak by sa to malo prekonvertovat na: $pole['cesta']['ku']['datam']. Problem spociva, ze $cesta moze mat hociaku hlbku zanorenia, a musel som to riesit cez if, elseif ako je v ukazke.. 9.12.2017
  • Kit : @mario2402: No vidíš, tohle jsem nevěděl a prvně jsem ty indexy spojil do stringu pomocí lomítek. Nesnažíš se náhodou suplovat databázi? 9.12.2017
  • mario2402 : ano, jedna sa o databazu uz raz ziskanych dat, pre dalsie pouzitie pocas behu skriptu, nizsie som ti napisal priklad pouzitia 9.12.2017
  • rmaslo : jj už chápu, řešení je dole. 9.12.2017
odkaz
9 Taco
odpověděl/-a 9.12.2017

Pokud trváš na zanoření polí, tak jeden způsob pomocí referencí:

class X
{
    private $data = [];
 
    function setData($path, $val)
    {
        self::setDataRef($this->data, $path, $val);
    }
 
 
    private static function setDataRef(&$ref, $path, $val)
    {
        $level = array_shift($path);
        if (empty($path)) {
            $ref[$level] = $val;
            return;
        }
 
        if (!isset($ref[$level])) {
            $ref[$level] = [];
        }
 
        self::setDataRef($ref[$level], $path, $val);
    }
 
}
 
$bank = new X;
$bank->setData(['a', 'b', 'c'], 'value');
 
print_r($bank);

Komentáře

  • Rike : Mám dotaz - proč je metoda setDataRef privátní (to chápu) a statická (to mi úplně nedochází)? Plyne z toho nějaká výhoda? 9.12.2017
  • Anonym : @Taco Nakonec tam ale stejně dáváš jako argument `($this->data`,nebo jsem něco asi přehlédl? Proč je statická? Nakonec má PHP něco jako je v Pythonu `@classmethod`? 9.12.2017
  • Taco : Statická je proto, protože v té metodě nepotřebuji $this. $this je další závislost, na kterou musím myslet. Čím méně závislostí, tím víc adidas. 9.12.2017
  • Taco : @uetoyo: Tak ten argument `$this->data` tam dávám jako inicializační bod, že jo. Nemůžu k němu přistupovat v jeho původním smyslu. *** Když bych to psal v Pythonu, tak bych nepoužíval statickou metodu, ale udělal bych si lokální funkci. (Ale v Pythonu neumím používat reference.) 9.12.2017
  • Anonym : @Taco "udělal bych si lokální funkci." Dík za vysvětlení! 10.12.2017

Pro zobrazení všech 8 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.