Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] Problem z referencją, podczas operacji na tablicy
Jarod
post
Post #1





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Nie wiem czy to ma znaczenie ale używam php 5.2.0. W php referencje pozwalają na stworzenie dwóch zmiennych odwołujących się do tej samej zmiennej. Podczas przeglądania tablicy funkcją foreach(), potrzebowałem nadpisywać/kasować pewne dane. Były dwa wyjścia:
1. najpierw przelecieć przez całą tablicę i do nowej tablicy przerzucić tylko te dane, które mnie interesują
2. usuwać/nadpisywać dane podczas przeglądania

Działanie poniższego kodu jest dla mnie niezrozumiałe. Czy może mi ktoś to wyjaśnić?

  1. <?php
  2. $tablica = array('1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11');
  3. //$tablicaRef = &$tablica;
  4. foreach($tablica As $key => $element)
  5. {
  6. $tablica[1] = 'WARTOŚĆ NADPISANA';
  7. echo $key . ' => ' . $element . '<br />';
  8. }
  9. echo '<br />--------------<br />';
  10. foreach($tablica As $key => $element)
  11. {
  12. $tablica[1] = 'WARTOŚĆ NADPISANA';
  13. echo $key . ' => ' . $element . '<br />';
  14. }
  15. ?>

Dopiero przy drugim przeglądaniu tablicy znajduje się wartość nadpisana. Jeśli odkomentuję drugą linijkę to w obydwóch przebiegach pętli znajdzie się wartość nadpisana.. Pomimo tego, że stworzyłem referencję a i tak korzystam z $tablica.. (IMG:http://forum.php.pl/style_emoticons/default/blinksmiley.gif)
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 558
Pomógł: 6315
Dołączył: 27.12.2004




http://www.php.net/manual/pl/language.references.whatdo.php
Cytat
Więc poniższy skrypt:
<?php
$a =& $b
?>
znaczy tyle, że $a oraz $b wskazują na tą samą zmienną.

Notatka: $a oraz $b są całkowicie równe, czyli nie $a wskazuje na $b lub odwrotnie, lecz $a oraz $b wskazują na to samo miejsce.

To pogróbione zdanie zdaje się wyjasniac zachowanie co tu pokazujesz.

Nie robiąc referencji, $tablica zawiera tablicę.
Robiąc jednak referencję, $tablica oraz $tablicaRef nie zawieraja tablicy jako takiej, ale wskazują na miejsce, wktórym ta tablica się znajduje. Dlatego też przy referencji, zmiany widoczne są od razu
Go to the top of the page
+Quote Post
Jarod
post
Post #3





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Cytat(nospor @ 28.08.2007, 06:27:39 ) *
Robiąc jednak referencję, $tablica oraz $tablicaRef nie zawieraja tablicy jako takiej, ale wskazują na miejsce, wktórym ta tablica się znajduje. Dlatego też przy referencji, zmiany widoczne są od razu

Co z tego, że stworzyłem referencję, jeśli z niej nie korzystam?
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 558
Pomógł: 6315
Dołączył: 27.12.2004




chodzi oto, ze tworząc referencje nawet dla innej zmiennej, to pierwsza zmienna tez juz nie zawiera tego co zawierala, a zawiera tez juz referencje do miejsca gdzie leza dane. To by wyjasnialo zachowanie twojego kodu.
Go to the top of the page
+Quote Post
Jarod
post
Post #5





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Cytat(nospor @ 29.08.2007, 05:10:01 ) *
chodzi oto, ze tworząc referencje nawet dla innej zmiennej, to pierwsza zmienna tez juz nie zawiera tego co zawierala, a zawiera tez juz referencje do miejsca gdzie leza dane. To by wyjasnialo zachowanie twojego kodu.


Jeżeli masz zmienn± $tablica, która zawiera tablicę, to zapis
  1. <?php
  2. $tablicaRef = &$tablica;
  3. ?>

powoduje, że zmienna $tablicaRef wskazuje na miejsce w pamięci, gdzie znajduje się $tablica. To jest jasne. Ale dlaczego przy okazji zmienna $tablica też staje się referencją?
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 558
Pomógł: 6315
Dołączył: 27.12.2004




Cytat
powoduje, że zmienna $tablicaRef wskazuje na miejsce w pamięci, gdzie znajduje się $tablica. To jest jasne. Ale dlaczego przy okazji zmienna $tablica też staje się referencją?
O rety, no przeciez przez caly czas to tlumacze...
Wczytaj sie w ten tekst z manuala:
Cytat
czyli nie $a wskazuje na $b lub odwrotnie, lecz $a oraz $b wskazują na to samo miejsce.
Tak zrobili i tak jest. Nie ma co sie nad tym rozwodzic.
Go to the top of the page
+Quote Post
Jarod
post
Post #7





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Ok. Wiem co napisali w manualu bo czytałem zanim napisałem posta. Było to dla mnie dziwne. Dzięki za odzew.

pzdr
Go to the top of the page
+Quote Post

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: 22.09.2025 - 01:08