Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]String jako kod
Forum PHP.pl > Forum > Przedszkole
TheEMP
Witam,

zaczne od przykładu:

pobieram wartość z tabllicy czyli jest to string (przykladowa wartosc, $wartosc = "[1][2][3][4]" )
chcialbym aby ta wartosc dzialala jako kod tzn.

$tablica.$wartosc = 1 ;

Rzecz w tym iż php bierze $wartosc jako string a nie jako kod.

W jaki sposob mozna sprawic aby wpisal 1 do tablicy w miejsce [1][2][3][4] ?

Z góry dziękuje.
amii
eval
by_ikar
Cytat
Rzecz w tym iż php bierze $wartosc jako string a nie jako kod.


W ogóle nic nie zrozumiałem. Możesz jeszcze raz napisać, o co dokładnie ci chodzi? Eval w przypadku takiego stringa;

Kod
[1][2][3][4]


nic nie da, bo to jest string. Najlepiej jak napiszesz co chcesz uzyskać, jakoś tak żebym mógł to zrozumieć wink.gif
TheEMP
Moim zamiarem jest aby string $string, który zawiera przykładowo "[1][2][3][4]" użyć jako składową tablicy wielowymiarowej tzn. przypuszczając, iż $tablica to tablica chce zapisać dowolną wartość do $tablica a ściślej w miejsce $tablica[1][2][3][4] gdzie to [1][2][3][4] to ten string. Wiem, że brzmi to dziwnie ale problem w tym, że jak napisze $tablica.$string = 'cokolwiek'; to $string nie jest składową $tablica tylko dalszą jej nazwą ponieważ to wciąż jest string. Próbuje rozwiązać ten problem z użyciem eval().
by_ikar
evalem tego problemu nie rozwiążesz. Do tego celu musisz stworzyć kilka funkcji, lub jedną jakąś uniwersalną. A i sam zapis dobrze by było gdybyś zmienił, zamiast [1][2][3][4] etc najlepiej jakbyś użył jakiegoś jednego znaku do rozdzielenia, powiedzmy kropki. W taki sposób jaki to próbujesz zrobić to nie osiągniesz swojego efektu. Ciężko będzie również samymi funkcjami taki efekt osiągnąć, najlepiej jakąś klasą. Na swoje potrzeby napisałem klasę konfiguracji, która porusza się po tablicy wielowymiarowej w taki sposób:

Kod
Config::get('framework.session.lifetime');


A jest to odpowiednik mniej więcej takiego kodu:

Kod
$config['framework']['session']['lifetime'];
celbarowicz
Przykład:
  1. <?php
  2. $a='echo "witaj balcer";';
  3. $t=array();
  4. $t[2]=$a;
  5. eval($t[2]);
  6. ?>
  7.  
Crozin
@by_ikar:
  1. $zmienna = array(...);
  2. $key = '[1][2][3][4]';
  3. $value = 1234;
  4.  
  5. eval('$zmienna' . $key . ' = ' . $value . ';');
  6. echo $zmienna[1][2][3][4];
Jednak eval jest najgorszym z możliwych rozwiązań.
  1. $zmienna = array(...);
  2. $key = '[1][2][3][4]';
  3. $value = 1234;
  4.  
  5. $keys = explode('][', trim($key, '[]'));
  6. $tmp = &$zmienna;
  7.  
  8. foreach ($keys as $key) {
  9. $tmp = &tmp[$key];
  10. }
  11.  
  12. $tmp = $value;
  13. echo $zmienna[1][2][3][4];
TheEMP
Udało mi się to ogarnąć.

Jak znajde więcej czasu to pomyśle nad lepszym sposobem.

Jeszcze raz dziękuję za pomoc.
by_ikar
@Crozin - fakt, da się osiągnąć to w eval, chyba za mało miałem z nim doczynienia, żeby taka składania przyszła mi do głowy. @TheEMP jeżeli chcesz poruszać się po tablicy wielowymiarowej podobnie jak ja, możesz skorzystać z tej klasy: https://gist.github.com/1442448 sposób poruszania się po tablicach, podpatrzony w yii. A używać możesz tego tak:

  1. <?php
  2.  
  3. $arr = array(
  4. 'ustawienia' => array(
  5. 'baza' => 'mysql:host=localhost;dbname=test;'
  6. ),
  7. 'pozostale' => array(
  8. 'jezyk' => 'pl',
  9. 'jezyki' => array(
  10. 'pl', 'de', 'fr'
  11. )
  12. )
  13. );
  14.  
  15. ArrayDot::get($arr, 'ustawienia.baza'); //pobieranie daych z tablicy, odpowiednik: $arr['ustawienia']['baza'];
  16.  
  17. ArrayDot::set($arr, 'ustawienia.baza', 'sqlite:/data/admin.db'); //zapisywanie danych do tablicy, odpowiednik: $arr['ustawienia']['baza'] = 'sqlite:/data/admin.db';
  18.  
  19. ArrayDot::delete($arr, 'ustawienia.baza'); //kasowanie danych z tablicy, odpowiednik: unset($arr['ustawienia']['baza']);


Możesz stworzyć klasę konfiguracji która będzie korzystać z klasy ArrayDot dzięki czemu jako pierwszego parametru nie będziesz musiał podawać tablicy, i korzystać z konfiguracji przykładowo w podobny sposób jak robię to ja:

  1. Config::get('framework.session.lifetime');
TheEMP
Właściwie to używam Yii. Nie przyszło mi na myśl tak tego zrobić. Widocznie jeszcze mnóstwo przede mną.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.