Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [wyrazenia regularne] Zmienne w themie...
Forum PHP.pl > Forum > PHP
bim2
Witam. Mam problem. Kombinuje z kumplem jak rozbić sobie np. {ZMIENNE:tablica:tablica2:tablica3...}
Mozna to zrobić funkcja preg_replace_Callback (explode(':'..., układać jak sie da i eval()) ale to jest wolne ohmy.gif
Dlatego chciałbym spytać się czy ktoś nie zna sposobu na jakieś inne rozbicie tejże zmiennej. (tablic w zmiennej może być w nieskończoność) aarambo.gif Mnie to przerosło worriedsmiley.gif
Kirtan Loor
  1. <?php
  2. preg_match_all("#:(S+)#", $zmienne, $arrays);
  3.  
  4. for( $i=0;$i<count($arrays[1]);$i++ )
  5. {
  6.  #....
  7.  eval($arrays[1][$i]);
  8. }
  9.  
  10. # ewentualnie
  11.  
  12. foreach( $arrays[1] as $tab )
  13. {
  14.  #...
  15.  eval($tab);
  16. }
  17. ?>


Hmm nie jestem pewien czy o to ci akurat chodzilo.
bim2
Napisałem że tak umiem. Chodzi bez evala bo zmniejsza mi 30% szybkości parsera sad.gif Bez evala tongue.gif
Kirtan Loor
Tobie chodzi o eval czy o wybieranie ze {ZMIENNE:...} tablic?
bim2
O wybieranie ale bez eval tongue.gif Zeby z {ZMIENNA:1:2:3:4}
było $ZMIENNA[1][2][3][4] chodzi o przetworzenie biggrin.gif. Czyli jak podam np {config:db:user} i mam zmienna $config[db][user] to {config:db:user} zamieni sie na warrtosc $config[db][user] biggrin.gif
Kirtan Loor
  1. <?php
  2.  
  3. $zmienne = '{user:db:config}';
  4.  
  5. preg_match_all("#:(S+)#", $zmienne, $arrays);
  6.  
  7. # musisz sobie wybrac nazwe zmiennej;
  8. $name = 'user';
  9.  
  10. $zm = '$'.$name;
  11.  
  12. foreach( $arrays[1] as $tab )
  13. {
  14.  $zm .= '['.$tab.']';
  15. }
  16.  
  17. eval($zm);
  18.  
  19. ?>

Wtedy masz teoretycznie tylko jeden eval... Bo bez w ogole to nie potrafie ci pomoc.;-) Nie jestem nawet pewien czy to zadziala;-)
bim2
Wrrr mad.gif Mówie że nie chce evala. Z (jednym) evalem umiem sobie zrobić bo co to za trudność ;/ Tylko chce bez evala. Może da się to jakoś przez referencje zrobić?
Kirtan Loor
Nie wiem jak by ci to mialo dzialac....
bim2
no, np przyłączanie tablic (jaka to była funkcja...) i wywołał to w referencji ;P. Tylko nie mam pomysłu jak. Może ktoś wpadnie ?
siemakuba
hej, mam taką funkcję, która tłumaczy ścieżkę na tablicę:
  1. <?php
  2. ArrayGet('config.users.database.password', $tablica);
  3. // zwraca wartość z tablicy:
  4. $tablica['config']['users']['database']['password'];
  5. ?>

nie wiem czy to do końca to co potrzebujesz, ale nie wykorzystuje tam eval, więc w razie czego bez problemu sobie przerobisz według potrzeb. Nie mam dostępu do tego kodu teraz, wieczorem dopisze tu.

pozdr.
bim2
Zobacze, w pewnym sensie o to chodzi. Bo wyciagam tabica:tablica1:tablica2 wiec moge zamiast kropek zmienic na : ;P Dzieki
Kirtan Loor
Cytat(siemakuba @ 26.06.2006, 09:08 ) *
hej, mam taką funkcję, która tłumaczy ścieżkę na tablicę:
  1. <?php
  2. ArrayGet('config.users.database.password', $tablica);
  3. // zwraca wartość z tablicy:
  4. $tablica['config']['users']['database']['password'];
  5. ?>

nie wiem czy to do końca to co potrzebujesz, ale nie wykorzystuje tam eval, więc w razie czego bez problemu sobie przerobisz według potrzeb. Nie mam dostępu do tego kodu teraz, wieczorem dopisze tu.

pozdr.


Hmm, czy to nie jest funkcja Javy?
siemakuba
oto obiecana funkcja:
  1. <?php
  2. function &ArrayGet(&$array, $path)
  3. {  
  4. $retval = null;
  5. $path  = explode('.', $path);
  6.  
  7. foreach ($path as $track)
  8. {
  9. if (!empty($retval)) 
  10. {  
  11. if (isset($retval[$track]))
  12. {  $retval =& $retval[$track];
  13. }
  14. else
  15. {  
  16. $retval = null;
  17. break;
  18. }
  19. }
  20. else
  21. {  $retval =& $array[$track];
  22. }
  23. }
  24. return $retval;
  25. }
  26. ?>

przykład:
  1. <?php
  2. $arr['test']['value']['foo'][] = 'bar1';
  3. $arr['test']['value']['foo'][] = 'bar2';
  4. $arr['test']['value']['foo'][] = 'bar3';
  5. $arr['test']['value']['foo'][] = 'bar4';
  6.  
  7. $test_value = ArrayGet($arr, 'test.value');
  8. print_r($test_value);
  9. ?>

wynik:
Kod
Array
(
    [foo] => Array
        (
            [0] => bar1
            [1] => bar2
            [2] => bar3
            [3] => bar4
        )

)

mam nadzieje że się przyda :)
Cytat
Hmm, czy to nie jest funkcja Javy?

@Kirtan Loor: hehe :) znam dwie Javy - Java wyspa jak wulkan gorąca i JavaScript :P
Notacja jest jak faktycznie jak w JavaScript, ale funkcja jest zdecydowanie php.

pozdr.
bim2
Wilkie dzieki ;P. Dodałem to do swojego prega i dziala:
  1. <?
  2. function &ArrayGet(&$array, $path)
  3. {  
  4. $retval = null;
  5. $path  = explode(':', $path);
  6.  
  7. foreach ($path as $track)
  8. {
  9. if (!empty($retval)) 
  10. {  
  11. if (isset($retval[$track]))
  12. {  $retval =& $retval[$track];
  13. }
  14. else
  15. {  
  16. $retval = null;
  17. break;
  18. }
  19. }
  20. else
  21. {  $retval =& $array[$track];
  22. }
  23. }
  24.  
  25. return $retval;
  26. }
  27.  
  28. $inf[2][5]='wysmienicie';
  29. $infos[2][5][8][4]='działa';
  30. function zmien($match)
  31. {
  32. global $$match[1];
  33.  
  34. return ArrayGet($$match[1], $match[2]);
  35. }
  36. $test='To {infos:2:5:8:4} {inf:2:5}';
  37. $test=preg_replace_callback("/{([A-Za-z_]*):([A-Za-z0-9:]*)}/", 'zmien', $test);
  38.  
  39. echo $test;
  40. ?>
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.