Tablice ( array )

Tablica w PHP jest obecnie uporządkowaną mapą . Mapa jest typem , który przyporządkowuje wartości do kluczy . Typ ten jest optymalizowany na wiele sposobów , więc można go używać jako typową tablicę , albo listę ( wektorową) , tablicę asocjacyjną (która jest jedną z implementacji mapy ) , słownik , kolekcję , stos , kolejkę , i temu podobne . Ponieważ wartością tablicy może być inna tablica PHP , można także łatwo symulować drzewa .

Wyjasnienie wspomnianych struktur wykracza poza problematykę tego podręcznika , aczkolwiek poniżej uwzględniono conajmniej jeden przykład na każdą z nich . Głębiej zainteresowanych czytelników odsyłamy do odpowiedniej literatury informatycznej .

Składnia

Tworzenie za pomocą array( )

Tablicę można utworzyć za pomocą konstrukcji językowej array( ) . Argumentem tej konstrukcji rozdzielone przecinkiem pary klucz = wartość .

klucz może być albo nieujemną liczbą całkowitą , albo łańcuchem znaków . Jeśli klucz jest standardową reprezentacją nieujemnej liczby całkowitej , zostanie zinterpretowany tak , jak jest ( tzn . '8 ' będzie zinterpretowane jako 8 , podczas gdy '08 ' będzie zinterpretowane jako '08 ' ) .

Wartością może być cokolwiek .

Jeśli pominiesz klucz , to jako klucz zostanie użyty najwyższy indeks całkowity + 1 . Jeśli nie ma w ogóle indeksu całkowitego , to klucz będzie miał wartość 0 ( zero ) . Jeśli użyjesz klucza , do którego już wcześniej została przypisana wartość , wartość ta zostanie nadpisana .

 
array(

 
[

 
  
   
klucz

  

 

 
=

 
]

 
  
   
wartość

  

 

 
,

 
..

 
.

 
     )

 
/

 
/

 
  
   
klucz

  

 

 
jest

 
albo

 
łańcuchem

 
znaków

 
,

 
albo

 
nieujemną

 
liczbą

 
całkowitą

 
/

 
/

 
  
   
wartość

  

 

 
może

 
być

 
dowolna





Przydatne funkcje

Jest wiele przydatnych funkcji obsługi tablic , o czym więcej w rozdziale Tablice .

Notatka : Funkcja unset( ) pozwala kasować komórki tablicy . W takiej sytuacji jednak tablica NIE zostanie zreindeksowana .

 
$a

 
=

 
array(

 
1

 
=

 
'jeden'

 
,

 
2

 
=

 
'dwa'

 
,

 
3

 
=

 
'trzy

 
'

 
)

 
;

 
unset

 
(

 
$a[2

 
]

 
)

 
;

 
/

 
*

 
to

 
tak

 
,

 
jakby

 
utworzyć

 
tablicę

 
:

 
$a

 
=

 
array

 
(

 
1

 
=

 
'jeden'

 
,

 
3

 
=

 
'trzy')

 
;

 
ale

 
NIE

 
:

 
$a

 
=

 
array

 
(

 
1

 
=

 
'jeden'

 
,

 
2

 
=

 
'trzy')

 
;

 
*

 
/





Struktura kontrolna foreach została stworzona specjalnie dla potrzeb tablic . Dzięki niej można łatwo trawersować tablicę .

Co wolno , a czego nie w tablicach ?

Dlaczego zapis $foo[ bar ] jest niepoprawny ?

W starych skryptach można spotkać taką składnię :

 
$foo[

 
bar

 
]

 
=

 
'coś'

 
;

 
echo

 
$foo[bar]

 
;

 
/

 
/

 
itd

 
.



Ten zapis jest niepoprawny, ale działa. Dlaczego zatem jest niepoprawny? Powód jest to, co opisano w rozdziale składnia , że pomiędzy nawiasami kwadratowymi (' [ ' i ' ] ') musi znajdować się wyrażenie. Oznacza to, że można używać czegoś takiego:
 
echo

 
$arr[

 
foo(true

 
)

 
]

 
;



Jest to przykład użycia wartości zwracanej przez funkcję jako indeksu tablicy. PHP zna też stałe, więc można spotkać zastosowanie E_* .
 
$opis_błędu[

 
E_ERROR

 
]

 
=

 
"Wystąpił

 
poważny

 
błąd"

 
;

 
$opis_błędu[E_WARNING

 
]

 
=

 
"PHP

 
wysłało

 
ostrzeżenie"

 
;

 
$opis_błędu[E_NOTICE

 
]

 
=

 
"To

 
jest

 
tylko

 
nieformalna

 
uwaga"

 
;



Proszę pamiętać, że E_ERROR jest także ważnym identyfikatorem, tak jak bar w pierwszym przykładzie. Ale ostatni przykład znaczy to samo co:
 
$opis_błędu[

 
1

 
]

 
=

 
"Wystąpił

 
poważny

 
błąd"

 
;

 
$opis_błędu[2

 
]

 
=

 
"PHP

 
wysłało

 
ostrzeżenie"

 
;

 
$opis_błędu[8

 
]

 
=

 
"To

 
jest

 
tylko

 
nieformalna

 
uwaga"

 
;



ponieważ E_ERROR znaczy to samo co 1 , itd.

W takiem razie , jak to możliwe , że $foo[ bar ] działa ? To działa , ponieważ bar , zgodnie z jego zapisem powinien być stałą . Jednakże w tym przypadku nie instnieje stała o nazwie bar . PHP teraz zakłada , że masz na myśli bar literalnie , czyli jako łańucuch " bar " , tylko że zapomniałeś napisać cudzysłowów .

Więc dlaczego tak jest źle ?

Kiedyś w przyszłości grupa PHP może chcieć dodać jeszcze jedną stałą lub słowo kluczowe i wtedy będziesz miał kłopot . Dla przykładu , obecnie już nie można używać słów empty i default , gdyż to specjalne słowa kluczowe .

Poza tym , jeśli dotąd argumenty nie przekonują cię : ta składnia jest po prostu odrzucona i kiedyś może przestać działać .

Notatka : Po przełączeniu error_reporting na E_ALL , zobaczysz , że PHP generuje ostrzeżenie , kiedy tylko powyższa składnia zostanie użyta . Tak samo generowane będą ostrzeżenia odnośnie innych odrzuconych " udogodnień" . (umieść w swoim skrypcie linię error_reporting(E_ALL) ; )

Notatka : Składnia ta jest dozwolona wewnątrz łańcucha znaków w podwójnych cudzysłowach . Więcej szczegółów na ten temat w rozdziale parsowanie zmiennych .

Przykłady

Typ tablicowy w PHP jest bardzo różnorodny , co prezentują poniższe przykłady .

 
/

 
/

 
to

 
:

 
$a

 
=

 
array(

 
'kolor

 
'

 
=

 
'czerowny

 
'

 
,

 
'smak

 
'

 
=

 
'słodki

 
'

 
,

 
'kształt

 
'

 
=

 
'okrągły

 
'

 
,

 
'nazwa

 
'

 
=

 
'jabłko

 
'

 
,

 
4

 
/

 
/

 
kluczem

 
będzie

 
0

 
)

 
;

 
/

 
/

 
znaczy

 
dokładnie

 
to

 
samo

 
,

 
co

 
to

 
:

 
$a['kolor'

 
]

 
=

 
'czerwony'

 
;

 
$a['smak'

 
]

 
=

 
'słodki'

 
;

 
$a['kształt'

 
]

 
=

 
'okrągły'

 
;

 
$a['nazwa'

 
]

 
=

 
'jabłko'

 
;

 
$a[

 
]

 
=

 
4

 
;

 
/

 
/

 
kluczem

 
będzie

 
0

 
$b[

 
]

 
=

 
'a'

 
;

 
$b[

 
]

 
=

 
'b'

 
;

 
$b[

 
]

 
=

 
'c'

 
;

 
/

 
/

 
znaczy

 
to

 
samo

 
co

 
:

 
array

 
(

 
0

 
=

 
'a

 
'

 
,

 
1

 
=

 
'b

 
'

 
,

 
2

 
=

 
'c

 
'

 
)

 
,

 
/

 
/

 
albo

 
prościej

 
:

 
array('a'

 
,

 
'b'

 
,

 
'c'

 
)





Przykład 7-4 . Użycie array( )

 
/

 
/

 
tablica

 
jako

 
mapa

 
właściwości

 
$mapa

 
=

 
array(

 
'version

 
'

 
=

 
4

 
,

 
'OS

 
'

 
=

 
'Linux

 
'

 
,

 
'lang

 
'

 
=

 
'polski

 
'

 
,

 
'short_tags

 
'

 
=

 
true

 
)

 
;

 
/

 
/

 
tylko

 
klucze

 
liczbowe

 
$array

 
=

 
array

 
(

 
7

 
,

 
8

 
,

 
0

 
,

 
156

 
,

 
-10

 
)

 
;

 
/

 
/

 
znaczy

 
to

 
samo

 
co

 
array

 
(

 
0

 
=

 
7

 
,

 
1

 
=

 
8

 
,

 
..

 
.

 
)

 
$zmiany

 
=

 
array

 
(

 
10

 
/

 
/

 
klucz

 
=

 
0

 
,

 
5

 
=

 
6

 
,

 
3

 
=

 
7

 
,

 
'a

 
'

 
=

 
4

 
,

 
11

 
/

 
/

 
klucz

 
=

 
6

 
(najwyższy

 
indeks

 
całkowity

 
był

 
5

 
)

 
,

 
'8

 
'

 
=

 
2

 
/

 
/

 
klucz

 
=

 
8

 
(całkowity

 
!

 
)

 
,

 
'02

 
'

 
=

 
77

 
/

 
/

 
klucz

 
=

 
'02

 
'

 
,

 
0

 
=

 
12

 
/

 
/

 
wartość

 
10

 
będzie

 
nadpisana

 
przez

 
12

 
)

 
;

 
/

 
/

 
pusta

 
tablica

 
$pusta

 
=

 
array()

 
;



Przykład 7-5 . Kolekcja

 
$kolory

 
=

 
array(

 
'czerwony'

 
,'niebieski'

 
,'zielony'

 
,'żółty')

 
;

 
foreach

 
(

 
$kolory

 
as

 
$kolor

 
)

 
{

 
echo

 
"Czy

 
lubisz

 
$kolor?\n"

 
;

 
}

 
/

 
*

 
wynik

 
:




 
Czy

 
lubisz

 
czerwony

 
?




 
Czy

 
lubisz

 
niebieski

 
?




 
Czy

 
lubisz

 
zielony

 
?




 
Czy

 
lubisz

 
żółty

 
?

 
*

 
/



Obecnie nie jest możliwa zmiana wartości w tabeli przy użyciu takiej pętli . Można to jednak rozwiązać tak :

Przykład 7-6 .

 
foreach

 
(

 
$kolory

 
as

 
$klucz

 
=

 
$kolor

 
)

 
{

 
/

 
/

 
nie

 
działa

 
:

 
/

 
/$kolor

 
=

 
strtoupper($kolor)

 
;

 
/

 
/

 
działa

 
:

 
$kolory[$klucz

 
]

 
=

 
strtoupper($kolor)

 
;

 
}

 
print_r($kolory)

 
;

 
/

 
*

 
wynik

 
:




 
Array

 
(

 
[0

 
]

 
=

 
CZERWONY

 
[1

 
]

 
=

 
NIEBIESKI

 
[2

 
]

 
=

 
ZIELONY

 
[3

 
]

 
=

 
ŻÓŁTY

 
)

 
*

 
/





Poniższy przykład tworzy tablicę z pierwszym kluczem 1 .

Przykład 7-7 . Pierwszy klucz 1

 
$kwartał

 
=

 
array(

 
1

 
=

 
'Styczeń'

 
,

 
'Luty'

 
,

 
'Marzec')

 
;

 
print_r($kwartał)

 
;

 
/

 
*

 
wynik

 
:




 
Array

 
(

 
[1

 
]

 
=

 
'Styczeń

 
'

 
[2

 
]

 
=

 
'Luty

 
'

 
[3

 
]

 
=

 
'Marzec

 
'

 
)

 
*

 
/





Przykład 7-8 . Wypełnianie prawdziwej tablicy

 
/

 
/

 
wypełnij

 
tablicę

 
zawartością

 
folderu

 
$uchwyt

 
=

 
opendir(

 
'

 
.')

 
;

 
while

 
($plik

 
=

 
readdir($uchwyt)

 
)

 
{

 
$pliki[

 
]

 
=

 
$plik

 
;

 
}

 
closedir($uchwyt)

 
;



Dane w tablicach uporządkowane . Ich kolejność może być zmieniona za pomocą różnorodnych funkcji sortujących . Więcej na ten temat w rozdziale tablice .

Przykład 7-9 . Sortowanie tablic

 
sort(

 
$pliki)

 
;

 
print_r($pliki)

 
;



Ponieważ wartością tablicy może być wszystko , może też nią być inna tablica . Można w ten sposób tworzyć tablice rekursywne i wielowymiarowe .

Przykład 7-10 . Tablice rekursywne i wielowymiarowe

 
$owoce

 
=

 
array

 
(

 
"owoce

 
"

 
=

 
array

 
(

 
"a

 
"

 
=

 
"pomarańcza

 
"

 
,

 
"b

 
"

 
=

 
"banan

 
"

 
,

 
"c

 
"

 
=

 
"jabłko

 
"

 
                                     )

 
,

 
"liczby

 
"

 
=

 
array

 
(

 
1

 
,

 
2

 
,

 
3

 
,

 
4

 
,

 
5

 
,

 
6

 
                                     )

 
,

 
"dziury

 
"

 
=

 
array

 
(

 
"pierwsza

 
"

 
,

 
5

 
=

 
"druga

 
"

 
,

 
"trzecia

 
"

 
                                     )

 
)

 
;