Autor Zpráva
nethor
Profil
Zdravím,
řeším tento problém:

Multidimenzi. poli potřebuji přiřadit hodnotu na správné místo.

V příkladu konkrétně $MultiArr["Tree"]["Branch"]["Blade"][] = "Green" ;

Jediné řešení, které mi funguje je s použitím fce eval(); ta je ale mnohdy kritizovaná.
Jde to i jinak?
$MultiArr = array();

function SetVal($Value,$Way){
    global $MultiArr    ;    
    $Eval = "\$MultiArr[".implode("][", $Way)."][] = \$Value    ;";
    eval($Eval)    ;
    return $MultiArr    ;
}

SetVal("Green",array("Tree","Branch","Blade"))    ;    


------  dump -------

array(1) {
  ["Tree"]=>
  array(1) {
    ["Branch"]=>
    array(1) {
      ["Blade"]=>
      array(1) {
        [0]=>
        string(5) "Green"
      }
    }
  }
}
Dan Charousek
Profil
Toto by ti mohlo pomoct.
Užití:

$val = &getByKeys($MultiArr, ['Tree', 'Branch', 'Blade']);
$val = "Green"
var_dump($MultiArr);

Trváš-li na té pomocné funkci SetVal(), tak nepoužívej globals, ale předej jen referenci na pole a té funkci zavolej getByKeys()
Až po odeslání jsem si všiml, že to chceš přidat jako prvek do pole, ta úprava je samozřejmě triviální, tak jen upozorňuji na to, že v mé ukázce je pod klíčem Blade string "Green"
nethor
Profil
Dan Charousek:
Děkuju, tohle jsem hledal. Zásadní bylo použití reference, to moc neznám => používám zřídka.

Globals jsem použil v příspěvku jen pro zjednodušení, fci používám jako metodu ve třídě.
Upravil jsem ještě vytvoření subpole při neexistujícím klíči, ve finále vypadá takhle:

function SetParseArr($Value) {
    $Iter = &$this->ParseArr;    
    foreach ($this->Tag as $key) {
        if (!isset($Iter[$key])) {
            $Iter[$key] = array();        
        }
        $Iter = &$Iter[$key];
    }
    $Iter[] = $Value    ;
}

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:

0