| 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: 14 let
|
|||
0