PHPDevs

Projekt obiektowy z Composerem i Twigiem? Czytaj!

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 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ś w tym stylu

<?php

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

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

...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 jej elementy wartościami z tablicy $argv. Ale tylko tymi które istnieją w $argv! 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);

array_replace() jako argumenty przyjmuje kolejne tablice. Później tylko łączy te same argumenty, a jeśli wcześniej nie istniały tworzy je. Gotową tablicę zwraca, w naszym przypadku nadpisujemy zmienną $argv.

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ą ilością 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 z taką dalej niezbyt czytelną tablicą zrobimy? Przypiszemy sobie przy użyciu list do odpowiednich zmiennych. Można by się obejść bez list i zrobić to tak:

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

Jednak skoro można zapisać tak:

<?php
$data = array_fill(0, 3, null);
$argv = array_replace($data, $argv);
list($filename, $command, $content) = $argv;

To dlaczego z tego nie skorzystać (i przy okazji przekazałem więcej wiedzy w kursie). Żadnej specjalnej magii tam nie ma, po prostu następuje przypisanie kolejnych elementów tablicy do kolejno podanych zmiennych.

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:

index.php<?php

$data = array_fill(0, 3, null);
$argv = array_replace($data, $argv);
list($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;

Początek omówiłem powyżej. Switch też powinieneś dobrze znać - jeśli nie, odsyłam do odpowiedniej 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 nie ma sensu, abym je po kolei omawiał bo to robi dokumentacja.

Poprzednia lekcja Następna lekcja

Udostępnij

  • Facebook
  • Twitter
  • Google+

Komentarze