Kontynuujemy poznawanie języka PHP. Tym razem przyswoimy sobie pewną ilość wbudowanych w ten język funkcji, bez których znajomości trudno nam będzie ruszyć dalej.

Tablica asocjacyjna – klucze, wartości

Tak wygląda tablica asocjacyjna:

<?php
$person = [
    'name' => 'John',
    'age' => 30
];
echo $person['name'] . " (" . $person['age'] . ")";
//John (30)

Możemy sprawdzić, czy dany klucz występuje w danej tablicy, przy pomocy funkcji array_key_exists:

<?php
$person = [
    'name' => 'John',
    'age' => 30
];
if(array_key_exists("name", $person)){
    echo $person["name"];
}
//John

Możemy też połączyć znaną nam już funkcję in_array z funkcją array_keys, która zwraca listę kluczy:

<?php
$person = [
    'name' => 'John',
    'age' => 30
];
if (in_array("name", array_keys($person))){
    echo $person["name"];
}
//John

Możemy iterować w pętli foreach po kluczach danej tablicy asocjacyjnej:

<?php
$person = [
    'name' => 'John',
    'age' => 30
];
foreach(array_keys($person) as $key)
{
    echo "$key => " . $person[$key] . "</br>";
}
// name => John
// age => 30

To samo możemy osiągnąć normalną pętlą foreach:

<?php
$person = [
    'name' => 'John',
    'age' => 30
];
foreach($person as $key => $value)
{
    echo "$key => $value</br>";
}
// name => John
// age => 30

Za pomocą array_values otrzymamy listę wartości danej tablicy asocjacyjnej:

<?php
$person = [
    'name' => 'John',
    'age' => 30
];
if(in_array("John", array_values($person)))
{
    echo "John is a value in array person";
}
//John is a value in array person

Mamy też dosyć ciekawe funkcje array_key_first oraz array_key_last:

<?php
$person = [
    'name' => 'John',
    'age' => 30
];
$first_key = array_key_first($person);
$last_key = array_key_last($person);
echo "$first_key => " . $person[$first_key] . "</br>";
echo "$last_key => " . $person[$last_key] . "</br>";
// name => John
// age => 30

Tekst – do wielkiej, małej i tak dalej

Aby podnieść tekst do wielkiej litery użyjemy funkcji strtoupper:

$msg = "hello world";
echo strtoupper($msg);
//HELLO WORLD

Aby podnieść pierwszą literę, użyjemy funkcji ucfirst:

<?php
$msg = "hello world";
echo ucfirst($msg);
//Hello world

Aby podnieść do wielkiej litery każdą pierwszą literę każdego wyrazu użyjemy funkcji ucwords:

<?php
$msg = "hello world";
echo ucwords($msg);
//Hello World

Funkcja lcfirst obniża pierwszą literę w napisie:

<?php
$msg = 'HELLO WORLD!';;
echo lcfirst($msg);
//hELLO WORLD!

Funkcja strtolower zamienia napis na pisany małą literą:

<?php
$msg = 'HELLO WORLD!';;
echo strtolower($msg);
//hello world!

Napisy – inne funkcje

Funkcja strlen podaje długość napisu:

<?php
$msg = 'HELLO WORLD!';;
echo strlen($msg);
//12

Funkcja strrev odwraca napis:

$msg = 'HELLO WORLD!';;
echo strrev($msg);
//!DLROW OLLEH

Funkcje str_starts_with i str_ends_with sprawdzają, czy dany napis zaczyna się/kończy się od podanego znaku/ciągu znaków:

<?php
$msg = 'HELLO WORLD!';
if (str_starts_with($msg,"HELLO"))
    echo "starts with HELLO</br>";
if (str_ends_with($msg,"!"))
    echo "ends with !</br>";

// starts with HELLO
// ends with !

Funkcja nl2br zamienia znak nowej linii (np. \n albo PHP_EOL) na tag „</br>”, rozpoznawany przez przeglądarkę internetową.

<?php
$msg = 'HELLO WORLD!';
if (str_starts_with($msg,"HELLO"))
    echo nl2br("starts with HELLO\n");
if (str_ends_with($msg,"!"))
    echo nl2br("ends with !" . PHP_EOL);

// starts with HELLO
// ends with !

Funkcja str_word_count podaje liczbę wyrazów w danym ciągu znaków:

<?php
$msg = 'HELLO WORLD!';
echo str_word_count($msg);
// 2

Funkcja trim usuwa niepotrzebne spacje

<?php

$msg = '   HELLO WORLD!   ';
echo trim($msg);
//HELLO WORLD!

Zadanie 1 – pierwsza litera wielką, reszta z małej

Chcemy wymusić określone zachowanie. Niezależnie od tego jakimi literami użytkownik zapisze swój login, chcemy, aby był on zapisany w określonym formacie, to jest pierwsza litera wielką, reszta małą.

Oto przykład nieprawidłowego loginu, gdzie nic nie jest ok:

<?php
$login = "   jOHN  ";

Mamy spacje po obu stronach, mamy pierwszą literę małą, mamy inne litery wielką.

<?php
$login = "   jOHN  ";
function normalize_login($login) {
    $login = trim($login);
    return ucfirst(strtolower($login));
}
echo normalize_login($login);
//John

Na początku, poprzez trim, usuwamy zbędne spacje po prawej i lewej stronie.

Później wrzucamy login najpierw w strtolower, które wyrównuje wszystkie litery do małej, później w ucfrist, które sprawia, że pierwsza litera zostanie zapisana wielką literą.

Zadanie 2 – napis od tyłu pętlą while

Znamy funkcję strrev, która odwraca nam tekst. Chcemy jednak wypisać tekst od tyłu nie korzystając z niej, za pomocą pętli while.

<?php
$msg ="hello world";
$idx = strlen($msg) - 1;
while($idx >= 0){
    echo $msg[$idx];
    $idx--;
}
//dlrow olleh

Indeks ostatni to długość napisu (funkcja strlen) minus 1, bo indeksy liczymy od zera.

Stawiamy warunek pętli while, aby szła tak długo, aż indeks przestanie być większy lub równy 0 (indeks pierwszego znaku).

Wypisujemy znak o danym indeksie i zmniejszamy indeks o 1 używając $idx–

Zadanie 3 – zamień klucze z wartościami

Do zamiany kluczy z wartościami też jest jakaś funkcja, można sobie w manualu PHP wyszukać. My postaramy się jednak zrobić to przy pomocy samemu napisanej funkcji.

Oto nasza tablica asocjacyjna:

<?php
$person = [
    'name' => "John",
    'age' => 30
];

Kluczami mogą być typy proste, ale zarówno napis jak i liczba jest typem prostym, więc zamienienie ich miejscami nie będzie stanowiło problemu.

<?php
$person = [
    'name' => "John",
    'age' => 30
];

function keys_values_swap($arr) {
    $output = array();
    foreach($arr as $key => $value)
    {
        $output[$value] = $key;
    }
    return $output;
}

$person_reversed = keys_values_swap($person);
print_r($person_reversed);
//Array ( [John] => name [30] => age )

Tutaj bierzemy tablicę arr jako argument funkcji i tworzymy nową, pustą tablicę output.

Następnie w pętli foreach przechodzimy po kluczach i wartościach, ale do output dodajemy je „na opak”, co chyba widać.

Zwracamy output, nasze wartości są teraz kluczami, zaś klucze wartościami.

Mówiłem, że możemy to zrobić, ponieważ nasze wartości są typami prostymi, a typy proste mogą być kluczami.

W PHP typy proste (czyli napis, liczba) nazywa się skalarnymi i do sprawdzenia czy wartość jest takim typem służy funkcja is_scalar.

Możemy to zastosować, aby zabezpieczyć się przed próbą tworzenia klucza z typu złożonego:

<?php
$person = [
    'name' => "John",
    'age' => 30,
    'languages' => array('PHP', 'JS', 'Python')
];

function keys_values_swap($arr) {
    $output = array();
    foreach($arr as $key => $value)
    {
        if(is_scalar($value))
            $output[$value] = $key;
    }
    return $output;
}

$person_reversed = keys_values_swap($person);
print_r($person_reversed);
//Array ( [John] => name [30] => age )

Tutaj pod kluczem languages mamy typ złożony, tablicę/listę. Taki typ może być wartością, ale nie kluczem.

Do naszej funkcji dodaliśmy w pętli sprawdzenie, czy dana wartość jest typem prostym (is_scalar). Tylko wtedy, gdy jest, robimy z niej klucz w nowej tablicy $output.

Dzięki temu klucze zostały zamienione z wartościami, ale tylko tam, gdzie to było możliwe. Wartości z tablicy $person, które kluczami być nie mogły (lista pod 'languages’) zostały pominięte.

Całkiem dużo w tej lekcji zrobiliśmy i myślę, że to dobry moment na koniec.

Naukę PHP oraz różne ćwiczenia z nim związane będziemy kontynuować w następnych odcinkach tutoriala.