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.. blinksmiley.gif


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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?


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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ą?


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
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.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

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


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 21.08.2025 - 09:49