Autor | Zpráva | ||
---|---|---|---|
Amatér23563 Profil * |
#1 · Zasláno: 27. 8. 2011, 18:06:21
Dobrý den.
Mám pole : $a = array("first", "sub", "index"); Poté další bole : $b = array("first" => array("sub" => array("index" => "hodnota"))); Nyní potřebuji udělat zápis : echo $b['first']['sub']['index']; Ale dynamicky, protože indexy umístěné v poly $a jsou proměnlivé. Napadla mě extrémní prasárna s tím že bych složil text $b['first']['sub']['index'] a prohnal přes eval, ale to je dost prasácké, musí existovat čistější řešení. Děkuji za rady. |
||
Tori Profil |
#2 · Zasláno: 27. 8. 2011, 18:14:00 · Upravil/a: Tori
Amatér23563:
Klíč pole může být i proměnná, tedy i hodnota z jiného pole: $a = array("first", "sub", "index"); $b = array("first" => array("sub" => array("index" => "hodnota"))); echo $b[$a[0]][$a[1]][$a[2]]; Můžete klidně použít jako klíč pole i návratovou hodnotu funkce nebo výraz, má-li to smysl $pole[time()]; $pole[(64/8-2)]; $pole[$obj->getVariable()]; |
||
Amatér23563 Profil * |
#3 · Zasláno: 27. 8. 2011, 18:41:28
Ano to vím, popíšu přesněji co dělám.
Mám určitý regulár, který mi ty klíče vytáhne, po menších úpravách v jednom poli, z textu například : <a href="first" target="sub" title="index"> ... </a> Čili dostanu to pole $a. A nyní potřebuji dostat : echo $b[$a[0]][$a[1]][$a[2]]; Ale nevím velikost pole $a, může mít 3, 4, 9 apod. hodnot. Doufám že již je trošku jasnější co přesněji chci. |
||
Tori Profil |
#4 · Zasláno: 27. 8. 2011, 18:54:14 · Upravil/a: Tori
Amatér23563:
Můžete sestavit regulár tak, aby ve výsledku byly jen ty hodnoty, které potřebujete (a tím pádem znáte jejich pořadí = klíč). Anebo si některé výsledky z reguláru pojmenovat (takže "first" bude pod $matches[1] i $matches['url]'). Koukněte do manuálu, jestli vám tohle pomůže. Možná bude i jiný způsob, teď mi napadly jen tyhle dva. |
||
Amatér23563 Profil * |
#5 · Zasláno: 27. 8. 2011, 18:59:10
Pořád si asi nerozumíme. Možná špatný příklad.
$s = "first-sub-index"; $a = explode("-", trim($s, "-") ); echo $b[$a[0]][$a[1]][$a[2]]; Jenže, nevím jestli v $s nebude třeba "first-sub-subsub-index" nebo jen "first-sub" a tak, tudíž nemůžu použít pevný zápis s třemi indexy. |
||
Tori Profil |
#6 · Zasláno: 27. 8. 2011, 19:04:52
Amatér23563:
Aha, no ale mluvil jste o reguláru. A co to přesně dělá? Nemáte aspoň přibližně definovaný formát vstupního řetězce? Např.pokud by mohl mít jen 3 nebo 4 nebo 5 prvků, tak ho rozdělíte do pole + podmínka podle počtu prvků. |
||
peta Profil |
#7 · Zasláno: 29. 8. 2011, 09:04:04 · Upravil/a: peta
Tak mozna eval, no.
$s = "first-sub-index"; $a = explode("-", trim($s, "-") ); $a = eval('$b['.implode("][", $a).']'); //"prohnal přes eval, ale to je dost prasácké", je, ale prijde mi to asi nejsnadnejsi echo $a; $s = "first-sub-index"; $a = explode("-", $s); $c = $b; foreach($a as $key=>$value) {$c = $c[$value];} //$b, $b[$value1], $b[$value1][$value2], $b[$value1][$value2][$value3] ... echo $a; Treba neco najdes v dokumentaci. http://cz2.php.net/manual/en/book.array.php |
||
Tori Profil |
#8 · Zasláno: 29. 8. 2011, 09:32:36
peta:
Ale šlo by to i bez evalu, třeba tokenizovat (i když to přepisování pole jeho obsahem je ošklivé): $pole = array("first" => array("sub" => array("index" => "hodnota"))); $s = "first-sub-index"; $tok = strtok($s, "-"); $out = $pole; while ($tok !== false) { $out = $out[$tok]; $tok = strtok("-"); } echo $out; $pole = array( 'first-sub-index' => 'hodnota1', 'first-sub-subsub-index' => 'hodnota2', ); |
||
Amatér23563 Profil * |
#9 · Zasláno: 30. 8. 2011, 12:00:11
Dobrá, napíšu přesně co dělám. Píšu si úplně primitivní šablonovací jazyk.
$this->template->name = "Petře"; <h1>Vítejte {var id="name"}</h1> Nyní se snažím přidat podporu pro nekonečně hluboké pole. $this->template->pole = array("prvni" => array("index" => "tady")); <h1>Vítejte {var id="pole-prvni-index"}</h1> Přeložit klasickou proměnnou z šablony do PHP není problém, že. $variable = "name"; //preg_match if( isset($this->vars[$variable]) ) { //preg_replace ...... } Ale nemůžu přijít na správný postup jak to udělat pro neznámě hluboké pole. |
||
Joker Profil |
#10 · Zasláno: 30. 8. 2011, 12:23:13 · Upravil/a: Joker
Amatér23563:
Ale tohle by nemělo být tak těžké. Algoritmus: - vytažení hodnoty ("pole-prvni-index") - indexy = explode pomlčkou (=> array("pole", "prvni", "index")) - dočasná proměnná = šablona->indexy[0] (tzn. to pole) - i = 1 - Dokud i < velikost pole "indexy" a zároveň dočasná proměnná není prázdná - - dočasná proměnná = dočasná proměnná [indexy[i]] - - i++ |
||
Amatér23563 Profil * |
#11 · Zasláno: 30. 8. 2011, 13:43:46
Joker:
Děkuji moc, vyřešeno! |
||
Časová prodleva: 13 let
|
0