Tablice

Z PHPEdia.pl
(Przekierowano z Tablica)
Skocz do: nawigacji, wyszukiwania

Tablice

Tablica to zbiór zmiennych. Każda tablica może posiadać dowolną liczbę elementów. Każdy element tablicy może mieć tzw. klucz, po którym można się do niego odwołać. W przypadku braku deklaracji klucza, ten jest generowany automatycznie.

Tablice można dowolnie zagnieżdżać.

Inicjalizacja tablic

Do inicjalizacji tablicy służy funkcja array():

<?php
$tablica = array ('pierwszy element', 'drugi element');
?>

Od PHP 5.4 możemy użyć w tym celu nawiasów klamrowych:

<?php
$tablica = ['pierwszy element', 'drugi element'];
?>

Wynikiem powyższych operacji będzie tablica :

Array
(
    [0] => pierwszy element
    [1] => drugi element
)

Jak widzimy indeksowanie tablicy rozpoczyna się od '0'. Jeśli chcemy to zmienić możemy zainicjować indeksowanie inną liczbę:

<?php
$tablica = array (12=>'dwunasty element', 'trzynasty element');
?>
Array
(
    [12] => dwunasty element
    [13] => trzynasty element
)

Za indeksy mogą nam posłużyć dowolne wartości skalarne:

<?php
$tablica = array ('imie'=>'Jan','nazwisko'=>'Kowalski','wiek'=>32);
?>
Array
(
    [imie] => Jan
    [nazwisko] => Kowalski
    [wiek] => 32
)

Tablice wielowymiarowe:

<?php
$tablica = array (
'osoba1'=>
array('imie'=>'Jan','nazwisko'=>'Kowalski','wiek'=>32),
'osoba2'=>
array('imie'=>'Kim','nazwisko'=>'Jakamoto','wiek'=>19)
);
?>
Array
(
    [osoba1] => Array
        (
            [imie] => Jan
            [nazwisko] => Kowalski
            [wiek] => 32
        )

    [osoba2] => Array
        (
            [imie] => Kim
            [nazwisko] => Jakamoto
            [wiek] => 19
        )
)

Przeglądanie tablic

Wyświetlanie tablicy

Zacznijmy od tego jak można wyświetlić tablicę:

<?php
$tablica= array(
'osoba1'=> array('imie'=>'Maciej','aka'=>'Tematu','wiek'=>21),
'osoba2'=> array('imie'=>'Krystyna','aka'=>'Krysia z gazowni','wiek'=>52),
'osoba2'=> array('imie'=>'Chuck','aka'=>'Chuck Norris','wiek'=>60)
);
?>

Funkcja print_r()

<?php
print_r($tablica);
?>
Array ( [osoba1] => Array ( [imie] => Maciej [aka] => Tematu [wiek] => 21 ) [osoba2] => Array ( [imie] => Krystyna [aka] => Krysia z gazowni [wiek] => 52 ) [osoba3] => Array ( [imie] => Chuck [aka] => Chuck Norris [wiek] => 60 ) )

Nie wygląda to zbyt efektownie. Możemy więc dodać znaczniki html "<pre>" które nam ładnie ten kod poukładają

<?php
echo "<pre>";
print_r($tablica);
echo "</pre>";
?>
Array
(
    [osoba1] => Array
        (
            [imie] => Maciej
            [aka] => Tematu
            [wiek] => 21
        )

    [osoba2] => Array
        (
            [imie] => Krystyna
            [aka] => Krysia z gazowni
            [wiek] => 52
        )

    [osoba3] => Array
        (
            [imie] => Chuck
            [aka] => Chuck Norris
            [wiek] => 60
        )

)

Dostęp do tablicy

Dostęp do tablicy mamy poprzez zmienną do której przypisana jest tablica, możemy odwołać się bezpośrednio do całej tablicy, jej części lub konkretnego pola.

Odwołajmy się więc do części tablicy:

<?php
echo "<pre>";
print_r($tablica['osoba2']);
echo "</pre>";
?>
Array
(
    [imie] => Krystyna
    [aka] => Krysia z gazowni
    [wiek] => 52
)

Lub do konkretnego pola:

<?php
echo "<pre>";
print_r($tablica['osoba2']['imie']);
echo "</pre>";
?>
Krystyna

Oczywiście wszystkie pola możemy szybciutko podmieniać

<?php
$tablica['osoba2']['imie']="Ewa";
?>

W tym momencie osoba2 (stara pani Krysia) zmienia Imię na Ewa.

Przeglądanie tablicy

Dostęp do tablicy możemy zrealizować poprzez funkcją foreach(tablica) która wykona się dla każdego elementu tablicy (1 poziom). Dzięki tej funkcji możemy wykonać np taką operację na pani Krysi:

Np. wyświetlmy dane w pożądanym formacie:

<?php
foreach($tablica['osoba2'] as $klucz => $wartosc)
{
echo $klucz .' : '.$wartosc.' <br/>';
}
?>
imie : Krystyna
aka : Krysia z gazowni
wiek : 52 

Lub dokonajmy zamiany wszystkich liter na wielkie:

<?php
foreach($tablica['osoba2'] as $klucz => $wartosc)
{
	$tablica['osoba2'][$klucz]=strtoupper($wartosc);
}
echo "pre>";
print_r($tablica['osoba2']);
echo "</pre>";
?>
Array
(
    [imie] => KRYSTYNA
    [aka] => KRYSIA Z GAZOWNI
    [wiek] => 52
)

Sortowanie tablic

Nasza tablica bez sortowania wygląda tak :

<?php
$tablica=array('Maciej1','Maciej3','Ania','Patryk','Maciej10','Marek','Paulina');
?>
Array
(
    [0] => Maciej1
    [1] => Maciej3
    [2] => Ania
    [3] => Patryk
    [4] => Maciej10
    [5] => Marek
    [6] => Paulina
)

asort

Funkcja asort: Sortuje tablicę zachowując skojarzenia kluczy

<?php
asort($tablica);
?>
Array
(
    [2] => Ania
    [0] => Maciej1
    [4] => Maciej10
    [1] => Maciej3
    [5] => Marek
    [3] => Patryk
    [6] => Paulina
)

arsort

Funkcja arsort(): Sortuje tablicę w porządku odwrotnym z zachowaniem skojarzenia kluczy

<?php
arsort($tablica);
?>
Array
(
    [6] => Paulina
    [3] => Patryk
    [5] => Marek
    [1] => Maciej3
    [4] => Maciej10
    [0] => Maciej1
    [2] => Ania
)

rsort

Funkcja rsort(): Sortuje tablicę w porządku odwrotnym bez zachowania skojarzeń kluczy

<?php
rsort($tablica);
?>
Array
(
    [0] => Paulina
    [1] => Patryk
    [2] => Marek
    [3] => Maciej3
    [4] => Maciej10
    [5] => Maciej1
    [6] => Ania
)

ksort

Funkcja ksort(): Sortuje tablicę według klucza

<?php
ksort($tablica);
?>
Array
(
    [0] => Paulina
    [1] => Patryk
    [2] => Marek
    [3] => Maciej3
    [4] => Maciej10
    [5] => Maciej1
    [6] => Ania
)

krsort

Funkcja krsort(): Sortuje tablicę według klucza w porządku odwrotnym

<?php
krsort($tablica);
?>
Array
(
    [6] => Ania
    [5] => Maciej1
    [4] => Maciej10
    [3] => Maciej3
    [2] => Marek
    [1] => Patryk
    [0] => Paulina
)

natsort

Funkcja natsort(): Sortuje tablicę używając algortmu "porządek naturalny"

<?php
natsort($tablica);
?>
Array
(
    [6] => Ania
    [5] => Maciej1
    [3] => Maciej3
    [4] => Maciej10
    [2] => Marek
    [1] => Patryk
    [0] => Paulina
)

sort

Funkcja sort(): Sortuje tablicę zwykłą - jeżeli jako argument podamy tablicę asocjacyjną, wówczas klucze zostaną zmienione na 0, 1, 2...

<?php
sort($tablica);
?>
Array
(
    [1] => Ania
    [2] => Maciej1
    [3] => Maciej10
    [4] => Maciej3
    [5] => Marek
    [6] => Patryk
    [7] => Paulina
)

usort

Funkcja usort(): Sortuje tablicę według wartości korzystając ze zdefiniowanej przez użytkownika funkcji porównującej. W przykładzie porównujemy tablicę według ilości znaków:

  • Funkcja: strlen(string) - zwraca ilość znaków
  • Funkcja: strcmp(string,string) - porównuje
<?php
function sortujPoDlugosci($a,$b)
{
	return strcmp(strlen($a),strlen($b));
}
usort($tablica,'sortujPoDlugosci');
?>
Array
(
    [0] => Ania
    [1] => Marek
    [2] => Patryk
    [3] => Maciej3
    [4] => Maciej1
    [5] => Paulina
    [6] => Maciej10
)

różne funkcje operujące na tablicach

is_array

Funkcja is_array(tablica) sprawdza czy tablica jest tablicą

<?php
	$tablica=array('jeden','dwa','trzy');
	$nieTablica="cztery";
	if(is_array($tablica)) 
	{ 
		echo 'To jest tablica <br/>'; 
	} 
	else 
	{ 
		echo'To nie jest tablica </br>'; 
	}
	if(is_array($nieTablica)) 
	{ 
		echo 'To jest tablica <br/>'; 
	} 
	else 
	{ 
		echo' To nie jest tablica </br>'; 
	}
?>
To jest tablica
To nie jest tablica

list

Funkcja list(wartosc1,wartosc2 ...) pozwala nam na przypisanie zmiennych tak jakby były tablicą

<?php
	// nasza tablica
	$tablica= array('Krystyna','Krysia z gazowni',52);
	// przypiszmy ją do zmiennych
	list($imie,$aka,$wiek)=$tablica;
	// i wyświetlmy
	echo 'Pani <b>'.$imie. '</b> `'.$aka.'` lat '.$wiek.' Dzwoniła ';
?>
Pani <b>Krystyna</b> `Krysia z gazowni` lat 52 Dzwoniła

explode

Funkcja explode(rozdzielacz,string) tworzy nam tablicę poprzez podzielenie tekstu określonym znakiem (nazwanym przezemnie `rozdzielaczem`);

<?php
	$dane="Krystyna:Krysia z gazowni:52";
	$tablica=explode(':',$dane);
 
	echo "pre>";
	print_r($tablica);
	echo "</pre>";
?>
Array
(
	[0] => Krystyna
	[1] => Krysia z gazowni
	[2] => 52
)

join

Funkcja join(łącznik,tablica) pozwala nam na połączenie tablicy określonym znakiem lub ciągiem.

<?php
	$tablica= array('Krystyna','Krysia z gazowni',52);
	$zapytanie = join(':',$tablica);
 
	echo $zapytanie;
?>
Krystyna:Krysia z gazowni:52

count

Funkcja count(tablica) zwraca ilość elementów w tablicy.

<?php
	$tablica= array('Krystyna','Krysia z gazowni',52);
	$ile = count($tablica);
 
	echo $ile;
?>
3

in_array

Funkcja in_array(szukane,tablica) zwraca 1 (TRUE) jeśli odnajdzie w tablicy szukaną wartość lub 0 (FALSE) w przypadku gdy takiej wartości niema.

<?php
	$tablica= array('Krystyna','Krysia z gazowni',52);
	$szukane ='Krystyna';
	if(in_array($szukane,$tablica))
	{
		echo $szukane.' jest w tablicy';
	}
	else
	{
		echo $szukane.' nie ma w tablicy';
	}
?>
Krystyna jest w tablicy

array_sum

Funkcja array_sum(tablica) sumuje wszystkie elementy tablicy

<?php
	$tablica= array(1,21,32,22,21,3,4);
	$suma =array_sum($tablica);
	echo 'Suma : '.$suma;
?>
Suma : 104

array_chunk

Funkcja array_chunk(tablica,ile elementów, true/false) dzieli tablicę na określoną ilość elementów (przy ustawieniu na True - utrzymuje klucze) w innym przypadku liczy od nowa.

<?php
	$tablica = array('Tomek', 'Romek', 'Atomek');
?>
Array
(
	[0] => Tomek
	[1] => Romek
	[2] => Atomek
)
<?php
	echo "pre>";
	print_r(array_chunk($tablica, 2, true));
	echo "</pre>";
?>
Array
(
	[0] => Array
	(
		[0] => Tomek
		[1] => Romek
	)
	
	[1] => Array
	(
		[2] => Atomek
	)
	
)

array_fill

Funkcja array_fill(start,ile,wartość) tworzy i wypełnia tablicę podaną wartością

<?php
	$tablica=array_fill(3,4,'Temat');
?>
	Array
	(
	[3] => Temat
	[4] => Temat
	[5] => Temat
	[6] => Temat
	)

array_keys

Funkcja array_keys(tablica) zwraca wszystkie klucze tablicy.

<?php
    $tablica= array('imie'=>'Krystyna','aka'=>'Krysia z gazowni','wiek'=>52);
	$klucze =array_keys($tablica);
	echo "pre>";
	print_r($klucze);
	echo "</pre>";
?>
Array
(
	[0] => imie
	[1] => aka
	[2] => wiek
)

array_merge

Funkcja array_merge(tablica,tablica,tablica ...) łączy dwie lub więcej tablic dodając wartości jednej do końca drugiej, w przypadku gdy wartości są takie same wstawia nowsze wartości.

<?php
	$tablica1= array('imie'=>'Krystyna','aka'=>'Krysia z gazowni','wiek'=>52);
	$tablica2= array('nazwisko'=>'Kapon','miasto'=>'Jelenia Gora');
	$tablica= array_merge($tablica1,$tablica2);
 
	echo "pre>";
	print_r($tablica);
	echo "</pre>";
?>
Array
(
	[imie] => Krystyna
	[aka] => Krysia z gazowni
	[wiek] => 52
	[nazwisko] => Kapon
	[miasto] => Jelenia Gora
)

array_pad

Funkcja array_pad(tablica,dopeśniaj Do,wartosc) dopełnia tablicę podanymi wartościami do określonej długości.

<?php
	$tablica= array(1,3,21,32);
	echo "Tablica
    pre>";
	print_r($tablica);
	echo "</pre>";
	$tablica = array_pad($tablica,6,0);
 
	echo "Dopeśniona tablica
	pre>";
	print_r($tablica);
	echo "</pre>";
?>
Tablica
	
Array
	(
	[0] => 1
	[1] => 3
	[2] => 21
	[3] => 32
)

Dopeśniona tablica
	
Array
(
	[0] => 1
	[1] => 3
	[2] => 21
	[3] => 32
	[4] => 0
	[5] => 0
)

array_pop

Funkcja array_pop(tablica) zdejmuje ostatni element tablicy.

<?php
	$tablica= array('imie'=>'Krystyna','aka'=>'Krysia z gazowni','wiek'=>52);
	$resztka=array_pop($tablica);
 
	echo "Z tablicy została zdjąta wartość : ".$resztka;
	echo "pre>";
	print_r($tablica);
	echo "</pre>";
?>
Z tablicy została zdjąta wartość : 52
	
Array
(
	[imie] => Krystyna
	[aka] => Krysia z gazowni
)

end

Funkcja end(tablica) ustawia wskaźnik tablicy na ostatnim jej elemencie (wybiera ostatni)

<?php
	$tablica= array('imie'=>'Krystyna','aka'=>'Krysia z gazowni','wiek'=>52);
	$koniec=end($tablica);
?>
	Ostatnim elementem jest : 52

array_push

Funkcja array_push(tablica,wartosc1,wartosc2,...) wstawia jeden lub więcej elementów na koniec tablicy.

<?php
	 $tablica= array('imie'=>'Krystyna','aka'=>'Krysia z gazowni','wiek'=>52);
	array_push($tablica,'kapon','Jelenia Gora');
 
	echo "pre>";
	print_r($tablica);
	echo "</pre>";
?>
Array
(
	[imie] => Krystyna
	[aka] => Krysia z gazowni
	[wiek] => 52
	[0] => kapon
	[1] => Jelenia Gora
)

Tablice wielowymiarowe

Tworzenie

<?php
 
$rodzina = array(
	array('windows',
		array('95','98','98se','ME','2000','xp')
	),
	array('linux',
		array('fedora','mandriva','gento','ubuntu'=>
			array('bezy','dapper'=>
				array('kde','xfc','gnome')
			)
		)
	),
 
);
 
echo "pre>";
print_r($rodzina);
echo "</pre>";
 
?>
Array
(
    [0] => Array
        (
            [0] => windows
            [1] => Array
                (
                    [0] => 95
                    [1] => 98
                    [2] => 98se
                    [3] => ME
                    [4] => 2000
                    [5] => xp
                )

        )

    [1] => Array
        (
            [0] => linux
            [1] => Array
                (
                    [0] => fedora
                    [1] => mandriva
                    [2] => gento
                    [ubuntu] => Array
                        (
                            [0] => bezy
                            [dapper] => Array
                                (
                                    [0] => kde
                                    [1] => xfc
                                    [2] => gnome
                                )

                        )

                )

        )

)

Praktyczne zastosowanie tablic

obsługa bazy danych

Wstąp

Jak zapewne wiecie bezy danych zwracają wynik w postaci tablicy danych, umiejątnie wykorzystując funkcje powiązane z tablicami możemy usprawnić wiele operacji na tych też bazach.

Zbudujemy prościutką klasą dzięki której będziemy obsługiwać podstawowe operacje na tabeli z danymi ludzi.

Oczywiście zapytania będziemy budować za pomcą tablic.

Struktura bazy

CREATE TABLE `ludzie` (
  `id` int(11) NOT NULL auto_increment,
  `imie` varchar(30) collate utf8_polish_ci NOT NULL default '',
  `nazwisko` varchar(35) collate utf8_polish_ci NOT NULL default '',
  `miasto` varchar(50) collate utf8_polish_ci NOT NULL default '',
  `email` varchar(50) collate utf8_polish_ci NOT NULL default '',
  `telefon` int(14) NOT NULL default '0',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci AUTO_INCREMENT=1 ;

Klasa obsługi

<?php
class ludzieBaza
{
	public $dane = array();
	public $szukane = array();
	public $nowe = array();
	private $db;
 
	public function __construct($szukane=null)
	{
		if(is_array($szukane))
		{
			$this->szukane=$szukane;
		}
		$this->db= new sql_db($host,$user,$haslo,$baza);
	}
 
	public function pobierzDane()
	{
		$sql=$this->db->sql_query("Select * From `ludzie` Where ".$this->listaWhere($this->szukane)." Limit 1");
		$this->dane=$this->db->sql_fetchrow($sql);
		return $this->dane;
	}
 
	public function pobierzListe()
	{
        $sql=$this->db->sql_query("Select * From `ludzie` Where ".$this->listaLike($this->szukane)." Order by `imie` ");
		return $this->db->sql_fetchrowset($sql);
	}
 
	public function dodajNowego()
	{
		$sql=$this->db->sql_query("Insert INTO `ludzie` (".$this->listaInsert($this->nowe).") Values (".$this->listaWartosci($dane).")");
	}
 
	public function zmienDane()
	{
		$sql=$this->db->sql_query("Update `ludzie` Set ".$this->listaUpdate($this->nowe)." Where  ".$this->listaWhere($this->dane)." ");
	}
        // Opis taki sam dla reszty funkcji.
	private function listaWhere($dane)
	{
               // sprawdzamy czy podane dane są tablicą
		if(is_array($dane))
		{
                       // rozbijamy każdy element tablicy na klucz i jego wartość
			foreach($dane as $klucz => $wartosc)
			{
                                 // tworzymy tablicę która sama ustala wartość klucza 
				$lista[]="`".$klucz."`='".$wartosc."'";
			}
                         // zwraca ciąg klucz=wartość połączony ciągiem AND 
			return @join(' AND ',$lista);
		}
	}
 
	private function listaLike($dane)
	{
		if(is_array($dane))
		{
			foreach($dane as $klucz => $wartosc)
			{
				$lista[]="`".$klucz."` LIKE '".$wartosc."'";
			}
			return @join(' AND ',$lista);
		}
	}
 
	private function listaInsert($dane)
	{
		if(is_array($dane))
		{
			return @join(',',array_keys($dane));
		}
	}
 
	private function listaWartosci($dane)
	{
		if(is_array($dane))
		{
			foreach($dane as $klucz => $wartosc)
			{
				$lista[]="'".$wartosc."'";
			}
			return @join(',',array_values($lista));
		}
	return 'Nie podano danych !';
	}
 
	private function listaUpdate($dane)
	{
		if(is_array($dane))
		{
			foreach($dane as $klucz => $wartosc)
			{
				$lista[]="`".$klucz."`='".$wartosc."'";
			}
			return @join(',',array_values($lista));
		}
	}
 
}
?>

działałnie

Pobierzmy jakąś osobę :

<?php
include "admin/klasy/bazaMySql.php5";
// przypisujemy tablicę z danymi osoby którą chcemy `załadować`
$osoba=new ludzieBaza(array('imie'=>'Maciej','nazwisko'=>'Niepodam'));
// ładujemy osobnika
$osoba ->pobierzDane();
?>
/* Zapytanie sql
Select * From `ludzie` Where `imie`='Maciej' AND `nazwisko`='Niepodam' Limit 1
*/

Dane pobrane z bazy danych :

Array
(
    [id] => 2
    [imie] => Maciej
    [nazwisko] => Niepodam
    [miasto] => Jelenia Gora
    [email] => jakisAdres@email.pl
)

Zmieśmy dane tej osoby :

<?php
// przypisujemy dane które mają być zmienione
$osoba->nowe=array('miasto'=>'Wroclaw','email'=>'inny@email.pl');
$osoba->zmienDane();
?>
/* Zapytanie sql
Update `ludzie` Set `miasto`='Wroclaw',`email`='inny@email.pl' 
Where `id`='2' AND `imie`='Maciej' AND `nazwisko`='Niepodam' AND `miasto`='Jelenia Gora' AND `email`='jakisAdres@email.pl'
*/

Dodajmy nową osobę :

<?php
$nowaOsoba=new ludzieBaza();
// przypisujemy dane nowej osobie za pomocą tablicy
$nowaOsoba->nowe=array('imie'=>'Maciej','nazwisko'=>'Jupik','miasto'=>'JGA');
$nowaOsoba->dodajNowego();
?>
/* Zapytanie sql
Insert INTO `ludzie` (imie,nazwisko,miasto) Values ('Maciej','Jupik','JGA')
*/

Pobierzmy listę osób które spełniają warunek :

<?php
$listaOsob=new ludzieBaza();
$listaOsob->szukane=array('imie'=>'Ma%');
$listaOsob->pobierzListe();
?>
/* Zapytanie sql
Select * From `ludzie` Where `imie` LIKE 'Ma%' Order by `imie`
*/