Aktualizacja do najnowszego PHP 8 już jest! Zobacz główne zmiany.

Tablice, stringi, pliki - kolejny projekt > Lekcja 2

Zabawa z tablicami

No dobrze, przygotowaliśmy przed momentem mały kod. Tylko czy on będzie na pewno wygodny? Czy pamiętanie, który indeks i za co odpowiada, jest dobrym pomysłem? Dodatkowo przed użyciem każdego musimy sprawdzać, czy na pewno on istnieje (mamy pewność tylko co do pierwszego, który zawsze będzie nazwą pliku). Po odrobinie zabawy z tablicami możemy rozwiązać to znacznie lepiej. Załóżmy na start, że odczytywać będziemy maksymalnie trzy elementy: nazwę pliku, komendę do wykonania oraz dodatek do niej (w przypadku dodawania zadania jego treść, w przypadku usuwania numer itd.). Standardowo zrobilibyśmy coś takiego:

<?php

$filename = $argv[0];
$command = $argv[1];
$content = $argv[2];

…ale efekt w przypadku zapomnienia czy pominięcia któregoś argumentu jest niezbyt przyjemny…

Ostrzeżenia &quot;PHP Notice: Undefined offset&quot; przy próbach odwołania się do nieistniejących elementów tablicy $argv
…więc zróbmy to lepiej :)

Stwórzmy tablicę z trzema nullami (puste wartości).

<?php
$data = [null, null, null];

Co teraz? Przy użyciu funkcji array_replace() zastąpimy te puste elementy wartościami z tablicy $argv - lecz tylko tymi, które w niej istnieją. W rezultacie więc otrzymamy zawsze tablicę z trzema elementami, a te, które nie zostały przekazane, będą wartością null.

<?php
var_dump($argv);

$data = [null, null, null];
$argv = array_replace($data, $argv);
var_dump($argv);

Efekt pierwszego var_dump - tablica z 1 elementem; efekt drugiego var_dump - tablica z 3 elementami

array_replace() jako argumenty przyjmuje kolejne tablice. Później tylko nakłada na siebie te same elementy tablicy, a nieistniejące tworzy. Zwraca gotową połączoną tablicę, w naszym przypadku nadpisujemy zmienną $argv. Generalnie warto być ostrożnym z nadpisywaniem oryginalnych danych „wstawianych” do skryptu, ale w tym przypadku mamy pewność, że nie będą potrzebne w innej formie i to tylko ich „poprawa”, więc pozwoliłem sobie na to.

Zamierzony efekt uzyskany, ale możemy to jeszcze odrobinę ulepszyć. Na przykład zapis $data = [null, null, null]; zastąpić funkcją, która sama stworzy tablicę z określoną liczbą elementów: array_fill(). Jako jej argumenty podajemy kolejno: początkowy indeks, ilość elementów do stworzenia oraz wartość, jaką otrzyma każdy element.

<?php
$data = array_fill(0, 3, null);
$argv = array_replace($data, $argv);
var_dump($argv);

Efekt będzie taki jak na poprzednim zrzucie. I co dalej z taką niezbyt czytelną tablicą zrobimy? Możemy ją rozbić, przypisując od razu wartości do konkretnych zmiennych. Moglibyśmy zrobić to dla przykładu tak:

<?php
$data = array_fill(0, 3, null);
$argv = array_replace($data, $argv);
$filename = $argv[0];
$command = $argv[1];
$content = $argv[2];

Jednak jest opcja zrobienia tego lepiej. Służy do tego list(), a od php >=7.1 do dyspozycji jest skrócony zapis z []. W nawiasach wpisujemy nazwy zmiennych, do których zostaną przypisane kolejne elementy tablicy.

<?php

list($filename, $command, $content) = $argv;
// same as
[$filename, $command, $content] = $argv;

Teraz możemy stworzyć mały mechanizm decydujący o tym, co należy uruchomić po wybraniu danej opcji. Użyjemy do tego celu switcha. Całość na razie prezentuje się tak i nawet działa:

<?php

$data = array_fill(0, 3, null);
$argv = array_replace($data, $argv);
[$filename, $command, $content] = $argv;

switch ($command) {
    case 'add':
        echo 'Add TODO';
        break;
    case 'remove':
        echo 'Remove TODO';
        break;
    case null:
        echo 'List';
        break;
    default:
        echo 'Sorry, invalid command!';
        break;
}
echo PHP_EOL;

Efekt wykonania kolejnych poleceń: php index.php - List, php index.php add &quot;New TODO&quot; - Add TODO, php index.php xyz - Sorry, invalid command!

Początek omówiłem powyżej. Switch też powinieneś dobrze znać - jeśli nie, wróć do lekcji na ten temat. O PHP_EOL wydaje mi się, że już wcześniej wspominałem. Jest to po prostu znak końca linii. Dodałem go na końcu ze względów czysto kosmetycznych, aby nastąpiło przejście do kolejnej linii w terminalu. Oczywiście funkcji do tablic jest znacznie więcej (nazwa większości zaczyna się od array_), jednak ciężko byłoby omówić wszystkie od razu.

Dokumentacja: www.php.net/manual/en/function.array-replace.php, www.php.net/manual/en/function.array-fill.php, www.php.net/manual/en/function.list.php, www.php.net/manual/en/migration71.new-features.php#migration71.new-features.symmetric-array-destructuring

Poprzednia lekcja Następna lekcja

Udostępnij

  • Facebook
  • Twitter

Komentarze