Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problem z wykryciem referencji pomiędzy tablicami., Fatal error: Nesting level too deep - recursive dependency
szagi3891
post
Post #1





Grupa: Zarejestrowani
Postów: 109
Pomógł: 9
Dołączył: 12.03.2007
Skąd: kraków/tarnobrzeg/baranów/suchorzów

Ostrzeżenie: (0%)
-----


  1. $tab = array();
  2.  
  3. $tab['zm'] = 'val';
  4. $tab['ref'] = &$tab;
  5.  
  6. print '<pre>';
  7.  
  8. var_dump($tab);
  9. print '<hr/>';
  10.  
  11. var_dump($tab['ref'] === $tab);
  12. print '<hr/>';


Jako wynik działania tego skryptu dostajemy :

  1. array(2) {
  2. ["zm"]=>
  3. string(3) "val"
  4. ["ref"]=>
  5. &array(2) {
  6. ["zm"]=>
  7. string(3) "val"
  8. ["ref"]=>
  9. *RECURSION*
  10. }
  11. }
  12.  
  13. Fatal error: Nesting level too deep - recursive dependency? in /home/szagi3891/ftp/baselib_site/ciemnia2.notatki.info/_error/ref.php on line 14


Czy ktoś wie jak wykryć referencję ? Nie wiedząc czemu ale operator === się gubi przy próbie wykrycie referencji tablicowej.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
mortus
post
Post #2





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


Nie wiem czemu ma służyć dublowanie w nieskończoność tablicy w tej samej tablicy. Zauważ, że var_dump($tab) pokazuje Ci zapis skrócony tablicy $tab, bo w miejscu *RECURSION* znajduje się cała tablica $tab, w której to znowu znajduje się cała tablica $tab, a w tej znowu znajduje się cała tablica $tab i tak w nieskończoność. Porównywanie za pomocą operatora === nie odnosi rezultatu, bo tych nieskończonych zagłębień jest zbyt wiele. Zresztą to i tak nie będzie sobie równoważne, bo w $tab znajduje się jedna referencja więcej, aniżeli w $tab['ref']. Przy takiej budowie tablicy $tab "wywali" się każda funkcja przeszukująca tablicę w głąb, nie tylko operator ===. Nie sprawdzałem, ale śmiem twierdzić, że nie tylko w PHP taka funkcja się "wywali".

Jednakże jest sposób na sprawdzenie, czy jedna tablica jest referencją drugiej:
  1. function is_reference(&$tab1, &$tab2) {
  2. $tab1['_reference'] = true;
  3. if($tab2['_reference']) {
  4. unset($tab1['_reference']);
  5. return true;
  6. }
  7. return false;
  8. }
  9. var_dump(is_reference($tab['ref'], $tab));


Ten post edytował mortus 8.09.2011, 07:31:53
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.12.2025 - 20:26