Autor Zpráva
Amatér23563
Profil *
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
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 *
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
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 *
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
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
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
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;
Mě spíš zajímalo, jestli když pod "first-sub-index" je textová hodnota, tak jestli nepotřebuje mít nějaký text i pod "first-sub" - což by přes pole asi nešlo. Taky by mohl mít jen jednorozměrné pole hodnot, tím by se to dost zjednodušilo:
$pole = array(
  'first-sub-index' => 'hodnota1',
  'first-sub-subsub-index' => 'hodnota2',
);
Ale to se musí vyjádřit Amatér23563.
Amatér23563
Profil *
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
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 *
Joker:
Děkuji moc, vyřešeno!

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0