Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] ArrayAccess i wielowymiarowe tablice
Forum PHP.pl > Forum > PHP > Object-oriented programming
v1ru5
Witam, mam następujący problem: patrząc na ten przykład
http://wortal.php.pl/wortal/artykuly/php/p...ard_php_library
ArrayAccess
ale zamieniając
  1. $oArray['name'] = 'name';

np na
  1. $oArray['name']['test'] = 'testowy';


dostaję: Notice: Indirect modification of overloaded element of oArray has no effect in

innymi słowy, jak zrobić tak aby była obsługa tablic wielowymiarowych?
jak z wnętrza offsetGet odczytać ten drugi i kolejne indexy tablic?
_olo_1984
  1. $oArray = new oArray();
  2. $oArray['name'] = array('jakas' => array('tablica' => array(0 => 'wielowymiarowa')));//dostęp do obiektu jak do tablicy
  3. echo $oArray['name']['jakas']['tablica'][0];

?
erix
Cytat
innymi słowy, jak zrobić tak aby była obsługa tablic wielowymiarowych?
jak z wnętrza offsetGet odczytać ten drugi i kolejne indexy tablic?

Ok, a pokaż, jak konstruujesz AA?
v1ru5
  1. class fixIndex implements ArrayAccess {
  2.  
  3. private $container = array();
  4. private $default_return = false;
  5.  
  6. function __construct( &$arr , $def_return = false ) {
  7. $this->container = &$arr;
  8. $this->default_return = $def_return;
  9. }
  10.  
  11. function __get($key) {
  12. if (array_key_exists($key, $this->container)) {
  13. return $this->container[ $key ];
  14. } else {
  15. //echo 'taki index nie istnieje<br>';
  16. return false;
  17. }
  18. }
  19.  
  20. function __set($key, $val) {
  21. $this->container[ $key ] = $key;
  22. }
  23.  
  24. function __call($name,$args) {
  25. return false;
  26. }
  27.  
  28. function offsetExists($key) {
  29. if (array_key_exists($key, $this->container)) {
  30. return true;
  31. } else {
  32. return false;
  33. }
  34. }
  35.  
  36. function offsetGet($key) {
  37. if (array_key_exists($key, $this->container)) {
  38. return $this->container[ $key ];
  39. } else {
  40. echo '<br><b>taki index ['.$key.'] nie istnieje</b>';
  41. return $this->default_return;
  42. }
  43. }
  44.  
  45. function offsetSet($key, $var) {
  46. $this->container[ $key ] = $var;
  47. }
  48.  
  49. function offsetUnset($key) {
  50. unset( $this->container[ $key ] );
  51. }
  52.  
  53. }
  54.  
  55. $oArray = Array();
  56. $oArray['name'] = 'name';
  57. $oArray['test'] = array('cos'=> 'cosx');
  58.  
  59. print_r($oArray);
  60.  
  61. $aTestowa = new fixIndex($oArray);
  62.  
  63. echo "<br> aTestowa[name] = ".$aTestowa['name']; //dziala
  64. echo "<br> aTestowa[brak] = ".$aTestowa['brak']; //dziala
  65. echo "<br> aTestowa[test][cos] = ".$aTestowa['test']['cos']; //dziala
  66. echo "<br> aTestowa[brak][brakujacy] = ".$aTestowa['brak']['brakujacy']; //dziala
  67. echo "<br> aTestowa[test][xxxxxx] = ".$aTestowa['test']['xxxxxx']; //NIE dziala
  68.  
  69.  


mam taką specyficzną sytuację, że jak indexu nie ma to sobie to loguje (w miejscu tych 'echo').
Działa to tak jak pisałem - dla tablic jednowymiarowych, przynajmniej mi tak z testów wyszło.
Ten ostatni przykład - z indexem 'xxxxxx', jak to zmodyfikować?
Jak zrobiłem coś źle to proszę o pomoc.
to $default_return zignorujcie winksmiley.jpg
kkr
To jest bug w php (nie planują go poprawiać ze względu na złożoność problemu): http://bugs.php.net/bug.php?id=32983

Tutaj http://stackoverflow.com/questions/2881431...mensional-unset jest opisane obejście (nie testowałem go jeszcze).

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.