Autor Zpráva
Wykrycek
Profil
Ahoj, nějak se trápím s takovou blbostí.
Mám problém s generováním adresy bunky ve vícerozměrném poli. Jde o jednoduchou návštěvní knihu, kde je celý obsah ukládán do souboru jako vícerozměrné pole. Celý tento soubor si načítám do proměnné
$obsah

Nevím ale jak určit "adresu" buňky, kterou chci upravit.

Příklad:
Potřebuji upravit obsah buňky
$obsah[0][3][0][3][0][2]


Z předchozí stránky si dokážu v textové podobě přenést informaci, že jde o buňku [0][3][0][3][0][2]

Jak z toho ale udělat název požadované proměnné?

Koukal jsem, že něco podobného řeší funkce eval(), jenže se mi to s ní vyřešit nepodařilo - nevím jak
Narazil jsem i na zápis
${'obsah'.'[0][3][0][3][0][2]'}
, ale to taky nefunguje.

Nenapadá někoho řešení týhle situace?
Timy
Profil
Wykrycek:
Předně mi připadá úchylné mít tak rozměrné pole. „Řešení” pak bude, že si z toho řetězce „[0][3][0][3][0][2]” vytáhneš ta čísla, uložíš do pole $indexes a pak provedeš něco takového:

$obsah[$indexes[0]][$indexes[1]]…


Vzhledem k tvému příklad pak platí:

$indexes[0]=0;
$indexes[1]=3;
Keeehi
Profil
preg_match_all('/(\d+)/','[0][3][0][3][0][2]',$ac);

a pak proměnná - $obsah[$ac[0]][$ac[1]][$ac[2]][$ac[3]][$ac[4]][$ac[5]];
Wykrycek
Profil
Timy:
Proti slovu úchylné nenám sebemenší výhradu :-)

Jse začátečník v PHP a koncept stránky, kterou dělám jsem si nenavrhl vůbec rozumně. Naštěstí jde o relativně malé dílo a tohle je poslední část. Nechce se mi proto předělávat vše a už to prostě nějak doplátuju :-)

Děkuji za návrh, hned to tak zkusím....
Wykrycek
Profil
Škoda, nápady jsou to dobré, ale ani jeden z nich mi problém neřeší..
Nebo je neumím správně použít..

Podle Timyho návodu jsem si z [0][3][0][3][0][2] udělal pole, kde mám jenom ta čísla. Ale jak z toho udělat to zmíněné $obsah[$indexes[0]][$indexes[1]]…??

Uměl bych to udělat pouze postupně, nejdřív bych si načetl $obsah[$indexes[0]] z toho pak [$indexes[1]] a tak dál.... Jenže tímhle postupem jsem schopný cílovou buňku pouze načíst (zjistit obsah), ale nedokážu obsah takové buňky změnit, protože bych potřeboval mít adresu buňky vygenerovanou celou... A to je právě to co neumím a na co se ptám :-)
Radek9
Profil
Wykrycek:
$obs = $obsah;
foreach($indexes as $index){
  $obs = $obs[$index];
}
echo $obs;
AM_
Profil
Radek9:
tohle nevím jak řeší jeho problém, že tu buňku chce přepsat.

Možná spíše:

$obs = $obsah;
foreach($indexes as $index){
  $obs = &$obs[$index];
}
$obs = 'novy obsah';

ale ruku do ohně za to nedám, referencování se někdy v PHP chová dost divně...
Keeehi
Profil
preg_match_all('/(\d+)/','[0][3][0][3][0][2]',$ac);
$ac=$ac[0];

echo $obsah[$ac[0]][$ac[1]][$ac[2]][$ac[3]][$ac[4]][$ac[5]];
Tak ještě jednou, přidal jsem druhý řádek (řeší původní chybu). Tento kód určitě funguje.
Wykrycek
Profil
Keeehi:
Tento nápad se zdá být zajímavý, ale fukce preg_match_all() je pro mě neznámá..
Funguje mi to, ale nějak zvláštně - vypisuje mi to obsah pole, ale vždy to na začátek vloží "Array" (ArrayText v bunce)..

Větší problém ale pro mě je, že nevím jak z tohoto zápisu udělat něco univerzálního... Jak zajistím, aby se mi $obsah[$ac[0]][$ac[1]][$ac[2]][$ac[3]][$ac[4]][$ac[5]]; měnilo podle toho s jakou buňkou právě pracuji?

Další věc je, že nevím co řeší $ac=$ac[0]; v druhém řádku..... (Když už jsem u toho vyzvídání:-) )
Wykrycek
Profil
AM:

$obs = $obsah;
foreach($indexes as $index){
  $obs = &$obs[$index];
}
$obs = 'novy obsah';



Zkouším to zapsat různými způsoby a výsledkem je vždy "NULL"..

Věřím, že problém nejspíš sedí na mém křesle, ale nějak to nechce fungovat :-)
AM_
Profil
Zkus možná napsat, o co se přesně snažíš a jak jsi došel k tomu krkolomnému šestirozměrnému poli, pak třeba vyplyne nějaké jednodušší řešení.
Wykrycek
Profil
Pokusím se to tedy nějak vysvětlit.

Vždy když někdo přidá příspěvek do knihy, uloží se tento příspěvek jako pole se třemi hodnotami. - array (datum, jmeno, text)
Když někdo chce na nějaký příspěvek odpovědět, vloží se jeho odpověď jako pole do ctvrté hodnoty - array (datum, jmeno, text, array (datum, jmeno, text) )
Když pak přibyde odpověď i na odpověď, dostaneme z toho i ten šestinásobný index.

Mým záměrem bylo zajistit, že když dostanu ke zpracování (úpravu nebo přidání) nové zprávy budu umět vygenerovat správný tvar proměnné ($obsah[x][x][y][y][z][z])
Jsem schopný si z předchozího formuláře poslat onen index [x][x][y][y][z][z], ale v textové podobě. Proto jsem si říkal, jestli neexistuje možnost "slepit" název proměnné z texhtových hodnot
$('obsah'.'[x][x][y][y][z][z]') = ....;
Keeehi
Profil
Wykrycek:
preg_match_all funguje asi takto: preg_match_all(výraz,v_čem_hledat,kam_vložit_výsledek);
výraz - to je pravidlo, podle kterého se má vyhledávat v v_čem_hledat - tento hledá čísla
v_čem_hledat - toto je řetězec, ve kterém se vyhledávají části podle toho zadaného pravidla (výraz)
kam_vložit_výsledek - je proměnná, do které se jako pole vloží všechny podřetězce odpovídající výrazu

takže pokud jako v_čem_hledat bude řetězec [0][3][0][3][0][2] tak po té funkci (a $ac=$ac[0];) bude $ac vypadat takto:
$ac[0]=0
$ac[1]=3
$ac[2]=0
$ac[3]=3
$ac[4]=0
$ac[5]=2


$ac=$ac[0]; řeší to, že funkce preg_match_all vloží do $ac výsledek jako dvourozměrné pole a tento řádek z tohoto pole vytvoří jednorozměrné.

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: