Autor | Zpráva | ||
---|---|---|---|
Wykrycek Profil |
#1 · Zasláno: 13. 6. 2010, 21:28:39 · Upravil/a: Wykrycek
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]'} Nenapadá někoho řešení týhle situace? |
||
Timy Profil |
#2 · Zasláno: 13. 6. 2010, 21:35:30
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 |
#3 · Zasláno: 13. 6. 2010, 21:39:42
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 |
#4 · Zasláno: 13. 6. 2010, 21:40:07
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 |
#5 · Zasláno: 13. 6. 2010, 22:08:01
Š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 |
#6 · Zasláno: 13. 6. 2010, 22:14:23
Wykrycek:
$obs = $obsah; foreach($indexes as $index){ $obs = $obs[$index]; } echo $obs; |
||
AM_ Profil |
#7 · Zasláno: 13. 6. 2010, 23:21:02
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 |
#8 · Zasláno: 13. 6. 2010, 23:29:04
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]]; |
||
Wykrycek Profil |
#9 · Zasláno: 13. 6. 2010, 23:50:50 · Upravil/a: Wykrycek
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 |
#10 · Zasláno: 13. 6. 2010, 23:59:51 · Upravil/a: Wykrycek
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 |
#11 · Zasláno: 14. 6. 2010, 00:24:47
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 |
#12 · Zasláno: 14. 6. 2010, 07:51:52
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 |
#13 · Zasláno: 14. 6. 2010, 08:40:16
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é. |
||
Časová prodleva: 14 let
|
0