Bo zawsze zapominam – printf

Mimo, że PHP automatycznie nadaje odpowiednie typy zmiennym, przydaje się czasem funkcja umożliwiająca formatowanie liczb. Taką funkcją, jest znana programistom C++, funkcja printf. Przyjmuje ona na sposób formatowania oraz to co ma zostać sformatowane.

Przykłady:

$liczba = 12;

Wówczas aby liczbę sformatować jako binarną, piszemy:

printf("%b", $liczba);

Otrzymujemy w wyniku: 10

$liczba = 12;

Wówczas aby liczbę sformatować jako ósemkową, piszemy:

printf("%o", $liczba);

Otrzymujemy w wyniku: 14

$liczba = 123;

Wówczas aby liczbę sformatować jako szesnastkową, piszemy:

printf("%x", $liczba);

Otrzymujemy w wyniku: 7b

$liczba = 123;

Wówczas aby liczbę sformatować jako szesnastkową z użyciem dużych liter, piszemy:

printf("%X", $liczba);

Otrzymujemy w wyniku: 7B

$liczba = 69;

Aby otrzymać kod ASCII danej liczby, piszemy:

printf("%c", $liczba);

Otrzymujemy w wyniku: O (duża litera O)

$liczba = -10;

Aby sformatować liczbę jako liczbę ze znakiem, piszemy:

printf("%d", $liczba);

Otrzymujemy w wyniku: -10

$liczba = 10;

Aby sformatować liczbę jako liczbę bez znaku, piszemy:

printf("%u", $liczba);

Otrzymujemy w wyniku: 10

$liczba = 34.23132;

Aby sformatować liczbę jako liczbę zmiennoprzecinkową, piszemy:

printf("%f", $liczba);

Otrzymujemy w wyniku: 34.2313

Dodatkowo możemy w przypadku liczb zmiennoprzecinkowych określić ile miejsc po przecinku danej liczby ma być wyświetlane

printf("%.3f", $liczba);

Otrzymujemy w wyniku: 34.231

Jak przypisać wartości zawarte w tablicy poszczególnym zmiennym – czyli lista + tablica

Czasem potrzebujemy przypisać wartości z danej tablicy pewnym konkretnym zmiennym. Można to zrobić w bardzo prosty sposób korzystając z listy:

$tablica = array(‘wartosc1′, ‘wartosc2′, ‘wartosc3′);
list($zmienna1, $zmienna2, $zmienna3) = $tablica;

Wówczas $zmienna1 będzie mieć wartość ‚wartosc1’, $zmienna2 – ‚wartosc2’, $zmienna3 – ‚wartosc3’;

Jeśli argumentów w liście po lewej stronie będzie więcej niż elementów tablicy, wartość nadmiarowych będzie pusta.

Moje ulubione nowe funkcje w PHP 5

Z szeregu nowych funkcji wybrałam parę – moim zdaniem bardzo przydatnych – funkcji:

Po pierwsze funkcja array_combine(). Umożliwia stworzenie tablicy asocjacyjnej na podstawie dwóch innych tablic – pierwsza z nich to tablica kluczy, a druga tablica wartości.

$tab1 = array('klucz1', 'klucz2', 'klucz3');
$tab2 = array('wartosc1', 'wartosc2', 'wartosc3');
$tab3 = array_combine($tab1, $tab2);

Wówczas tablica $tab3 ma postać:

$tab3 = array('klucz1'=>'wartosc1', 'klucz2'=>'wartosc2', 'klucz3'=>'wartosc3');

Drugą jak dla mnie dość przydatną funkcją jest http_build_query(). Funkcja ta z argumentów podanych w tablicy (bądź obiektu) jako argumencie wejściowym tworzy łańcuch podobny łańcuchowi powstającemu przy przesyłaniu danych metodą GET. Dlatego też funkcja ta może się przydać do budowania takich właśnie zapytań, ale nie tylko.

Tablicą wejściową może być zwykła tablica:

$tab = array('zyrafa', los', 'hipopotam')
http_build_query($tab);

Wówczas stworzony łańcuch wygląda następująco:

0=zyrafa&1=los&2=hipopotam

Może to być tablica asocjacyjna:

$tab = array('duze zwierze'=>'zyrafa', 'rogate zwierze'=>'los', 'hipopotamowate'=>'hipopotam');
http_build_query($tab);

Wówczas łańcuch będzie miał postać:

duze+zwierze=zyrafa&rogate+zwierze=los&hipopotamowate=hipopotam

Może być mieszanka tablicy normalnej z asocjacyjną:

$tab = array('zyrafa', 'los', 'hipopotamowate'=>'hipopotam');
http_build_query($tab);

Funkcja zwróci wówczas:

0=zyrafa&1=los&hipopotamowate=>hipopotam

Jeśli nie chcemy by elementy były indeksowane samymi cyframi, można do funkcji dodać argument stanowiący przedrostek:

$tab = array('zyrafa', 'los', 'hipopotamowate'=>'hipopotam');
http_build_query($tab, 'arg');

Otrzymamy:

arg0=zyrafa&arg1=los&hipopotamowate=>hipopotam

Jak już jesteśmy przy argumentach funkcji należałoby dodać, że można również określić za pomocą jakiego znaku mają być łączone argumenty. Domyślnie jest nim znak &, ale może być to dowolny inny.

$tab = array('zyrafa', 'los', 'hipopotam')
http_build_query($tab, '', '|');

Wówczas stworzony łańcuch wygląda następująco:

0=zyrafa|1=los|2=hipopotam

Jeśli argumentem funkcji będzie tablica wielowymiarowa postaci:

$tab = array
(
	'osoba' => array
			(
 
				'imie' => 'Jan',
				'nazwisko' => 'Kowalski',
				'wiek' => 20
 
			)
);

Wówczas otrzymamy łańcuch postaci

osoba%5Bimie%5D=Jan&osoba%5Bnazwisko%5D=Kowalski&osoba%5Bwiek%5D=20

Jak widać został on już encodowany z postaci:

osoba[imie]=Jan&osoba[nazwisko]=Kowalski&osoba[wiek]=20

PHP – sztuczki

Natknęłam się ostatnio na ciekawą rzecz.
Prawie każdy zna wywodzący się z C operator warunkowy (?:). Dla przypomnienia – jedyny trójargumentowy operator – świetnie zastępuje if…else… – przynajmniej w prostych przypadkach.

Przykład zastosowania:

$a = 10;
$b = ($a > 4) ? 100 : 200;

Wówczas zmienna $b zależnie od wartości zmiennej $a przyjmie:
wartość 100 – jeśli zmienna $a będzie większa niż 4
wartość 200 – jeśli zmienna $a będzie mniejsza lub równa 4.
W powyższym przykładzie $a jest większe niż 4 więc zmienna $b przyjmie wartość 100.
Myślałam, że to wszystko jeśli chodzi o operator ?: – do wczoraj.
Kiedy to okazało się, że argumentami tego operatora mogą być funkcje i to w całkiem inny sposób niż robiłam to do tej pory.

Kolejny przykład:

function inkrementacja($i)
{
    return ++$i;
}
function dekrementacja($i)
{
    return$i;
}
$a = 10;
$b = ($a > 4) ? 'inkrementacja' : 'dekrementacja';
$b = $b($a);

Co się stanie?
Jeśli zmienna $a będzie większa od 4, zmiennej $b zostanie przypisany wynik wyrażenia: inkrementacja($a).
Jeśli zmienna $a będzie mniejsza lub równa 4, zmiennej $b zostanie przypisany wynik wyrażenia: dekrementacja($a).
I tak w tym przypadku wartość zmiennej $b wyniesie 11.

Dlaczego nie zrobić tego tradycyjnie?
Tradycyjnie wyglądałoby to tak:

function inkrementacja($i)
{
    return ++$i;
}
function dekrementacja($i)
{
    return$i;
}
$a = 10;
$b = ($a > 4) ? inkrementacja($a) : dekrementacja($b);

Zmienna $b przyjmuje teraz wartość 11.

Jaka jest wyższość wcześniejszego rozwiązania nad tradycyjnym? Moim zdaniem – spora, choć jeszcze nie znalazłam na to konkretnego zastosowania, ale jestem pewna, że się przyda. Nie-tradycyjne tworzy minifunkcję – można wielokrotnie sprawdzać warunek ($a > 4) i przypisywać zmiennej $b – bądź jakieś innej zmiennej wartości zwracane przez funkcje inkrementacja i dekrementacja. Jak to?
Można wielokrotnie później wywoływać $b($a) podstawiając za $a coraz to nowe wartości.
Natomiast tradycyjne rozwiązanie pozwala tylko raz sprawdzić warunek i raz dokonać podstawienia.
Wszystko więc zależy od potrzeb.
Nawiasem – nie znalazłam żadnych udokumentowanych źródeł pozwalających dokonać czegoś takiego w C – choć w końcu PHP napisano w C. Co prawda próbowałam eksperymentować i z moich doświadczeń wynika, że zastosowanie tej „innej” składni w C nie jest możliwe;)
To tylko pogłębia moją sympatię do PHP.