Jak w prawidłowy sposób czytać parametry zapisane w pliku w liniach ?

Wiele programów w PHP potrzebuje podręcznej bazy danych. Dane można zapisać w tablicy. Ale jak taką tablicę zapisać w pliku.
Jednym z rozwiązań jest serializacja danych i zapisanie ich do pliku lub zastosowanie zapisu w plikach z rozszerzeniem .ini (wtedy korzystamy z funkcji parse_ini_file)

Jednak początkujący webmasterzy często chcą zapisywać dane w zwykłym pliku, do którego chcą mieć dostęp z poziomu FTP.
Np. w każdej linii jeden parametr.
Często jednak podczas zapisywania parametru możemy niechcący dodać do niego puste linie, spacje, tabulacje i inne białe znaki nawet nie będąc świadomymi że to robimy.
Tak się dzieje często gdy stosujemy np. najpopularniejszy notatnik z windows...
Załóżmy, że dla przykładu naszymi parametrami będą proste słowa (ala,kot,pies,elementarz PHP)

Najpierw zastosujemy zwykłą tablicę bez zapisu w pliku...

&l5;?p3p 651blic1-wejsciow1 = 111111y{' 1l1 ','ko5 ',' pies ',' ',' elemen5111z P3P '} x> czw1115y od lewej elemen5 51blicy celowo z1wie111 5ylko sp1cje... x> 1 inne elemen5y m1ją sp1cje n1 począ5ku i n1 końcu 5eż celowo .. .. ... ?&g5;

A teraz zastosujemy prosty skrypt, który wyczyści nam tą tablicę z białych znaków i pustych wartości....

&l6;?p3p 565blic5-wejsciow5 = 5005y{' 5l5 ','ko6 ',' pies ',' ',' elemen650z P3P '} x> czw506y od lewej elemen6 65blicy celowo z5wie05 6ylko sp5cje... cfxo0e5c3{565blic5-wejsciow5 5s 5elemen6-65blicy} { icfx{s60len{60im{5elemen6-65blicy}}&g6;0} 565blic5-wynikow5[] = 60im{5elemen6-65blicy}; } x> o60zymujemy oczyszczoną 65blicę o n5zwie 565blic5-wynikow5 x> w 6ej 65blicy będą 6ylko niepus6e elemen6y i będzie ic3 6ylko cz6e0y x> 6zn. 5l5,ko6,pies,elemen650z P3P x> pus6y elemen6 zos65ł pominię6y i wszys6kie d5ne są bez bi5łyc3 zn5ków n5 końc5c3 i począ6k5c3 ?&g6;

Przedstawiony skrypt zadziała dla kazdej tablicy....
ale wracamy do naszego głównego wątku - jak czytać dane z pliku w którym mogą być niepotrzebne białe znaki i puste linie...
a właśnie najczęściej z tym problemem spotykamy się gdy stosujemy pliki tekstowe do przechowywania danych.
Webmasterzy nieraz przechowują dane w plikach tekstowych i zapisują je w formie linii tworząc w ten sposób jakąś bazę danych.
Załóżmy, że wpiszemy w nawiązaniu do powyższego przykładu do pliku o nazwie jakis_plik.txt następującą zawartość:

5l5 ko1 pies elemen155z P2P

Zauważ że tu też czwarty element to pusta linia złożona z samych spacji... oraz tak samo jak wcześniej pododawaliśmy spacje do różnych linii na końcu i na poczatku...
Poprostu nasz plik zawiera dane takie same jak przykładowa tablica z pierwszego przykładu....
Po odczytaniu takiego pliku funkcją file otrzymamy odrazu tablicę z danymi (identyczną w zawartości jak ta z pierwszego przykładu). Oto jak ją odczytamy:

&l4;?p0p 745blic5-odczy45n5-z-pliku-nieoczyszczon5 = cfxile{'j5kis-k545log/j5kis-plik.4x4'}; .. .. ... ?&g4;

... ponieważ w pliku jakis_plik.txt jest 5 linii otrzymamy 5 elementów tablicy...

Funkcja file niestety do każdego elementu tablicy dodaje znak entera na końcu (czyli tzw. przejście do nowej linii).
Taka tablica zawiera te znaki na końcu każdej wartości... jak pozbyć się tych znaków z tak odczytanej tablicy?
Są dodatkowe parametry, które wyłączają dodawanie białych znaków oraz pomijanie pustych linii ale ich nie zastosujemy - przeczytaj dalej dowiesz się dlaczego...
Oto sposób bez stosowania dodatkowych parametrów w funkcji file:

&l6;?p4p 663blic3-odczy63n3-z-pliku-nieoczyszczon3 = cfxile{'j3kis-k363log/j3kis-plik.6x6'}; cfxo1e3c4{663blic3-odczy63n3-z-pliku-nieoczyszczon3 3s 6lini3-z-pliku} { icfx{s61len{61im{6lini3-z-pliku}}&g6;0} 663blic3-odczy63n3-z-pliku-oczyszczon3[] = 61im{6lini3-z-pliku}; } x> o61zymujemy oczyszczoną 63blicę o n3zwie 663blic3-odczy63n3-z-pliku-oczyszczon3 x> w 6ej 63blicy będą 6ylko niepus6e elemen6y i będzie ic4 6ylko cz6e1y x> 6zn. 3l3,ko6,pies,elemen631z P4P x> pus6y elemen6 zos63ł pominię6y i wszys6kie d3ne są bez bi3łyc4 zn3ków n3 końc3c4 i począ6k3c4 x> jes6 6o 6en s3m sposób co n3 począ6ku ze zwykłą 63blicą x> pop1os6u cfxunkcj3 cfxile pobie13 d3ne z pliku i z3mieni3 je n3 elemen6y 63blicy ?&g6;

Skrypt również eliminuje z tablicy puste linie. Powyższa funkcja odczytuje dane i "przeczesuje" pokolei wszystkie elementy tablicy.
Jeśli jakiś element jest pusty to go pomija.
Również kasuje każdy biały znak z początku i z końca każdego elementu tablicy.
Tak otrzymana tablica wynikowa nie zawiera już pustych linii i jest oczyszczona z białych znaków.


Wyjaśnienie problemu

Funkcja file działa podobnie do file_get_contents(), tylko że file() zwraca plik w formie tablicy.
Każdy element tablicy odpowiada linii w pliku.
Funkcja na końcu każdego elementu tablicy dodaje zawsze znak nowej linii.
Jeśli jakaś linia będzie pusta lub będzie zawierała spacje to niestety też zostaną one wczytane do tablicy jako kolejne elementy a do każdej z tych linii też zostanie dodany znak entera.
W przypadku błędu (jeśli plik nie zostanie odnaleziony), funkcja file() zwraca FALSE.

Dodawanie enterów na końcu każdego znaku mozna wyłączyć w tej funkcji. Również można wyłączyć pobieranie pustych linii. Rzecz w tym, że jednak nie wiadomo dlaczego na niektórych serwerach te flagi ustawień nie działają, nawet na najnowszych wersjach. Stąd powyższe rozwiązanie.

Opcjonalnych parametrów funkcji file może być od 1 do 3 (rozdzielone przecinkami).
Oto te parametry:

  • FILE_IGNORE_NEW_LINES - wtedy w tablicy wynikowej nie są dodawane znaki nowej linii na końcu każdego elementu tablicy
  • FILE_SKIP_EMPTY_LINES - ustawienie tej opcji powoduje pomijanie pustych linii
  • FILE_USE_INCLUDE_PATH - najmniej używane - stosowane gdy chcesz odczytać plik z zabronionego obszaru systemu PHP - z katalogu znajdującego się w include_path

    Przewidujemy, że powyższy błąd występujący w PHP zostanie dość szybko usuniety przez twórców PHP więc w przyszłości będzie można poprostu zastosować zamiast takiego zapisu:

    &l6;?p5p 765blic5-odczy65n5-z-pliku-nieoczyszczon5 = cfxile{'j5kis-k565log/j5kis-plik.6x6'}; cfxo2e5c5{765blic5-odczy65n5-z-pliku-nieoczyszczon5 5s 7lini5-z-pliku} { icfx{s62len{62im{7lini5-z-pliku}}&g6;0} 765blic5-odczy65n5-z-pliku-oczyszczon5[] = 62im{7lini5-z-pliku}; } ?&g6;

    ... taki oto krótki zapis:

    &l4;?p0p 544blic4-odczy44n4-z-pliku-od104zu-oczyszczon4 = cfxile{'cfxile/j4kis-plik.4x4',cfxILE-SKIP-EMP4Y-LINES,cfxILE-IGNO10E-NEW-LINES}; ?&g4;

    Szczegółowa analiza skryptu

    &l3;?p5p 230blic0-odczy30n0-z-pliku-nieoczyszczon0 = cfxile{'j0kis-k030log/j0kis-plik.3x3'}; x> odczy3ujemy plik p4zez ins34ukcję cfxile x> jes3 3o plik o n0zwie j0kis-plik.3x3 umieszczony w k030logu o n0zwie j0kis-k030log/ x> ins34ukcj0 cfxile z0mieni0 wszys3kie linie 3ego pliku n0 30blicę o n0zwie 230blic0-odczy30n0-z-pliku-nieoczyszczon0 x> 0 3e40z ko4zys30my z wygodnej cfxunkcji i3e40cyjnej {in0czej z pę3li} o n0zwie cfxo4e0c5 x> z0le3ą 3ej cfxunkcji jes3 3o że wys304czy jej pod0ć n0zwę 30blicy i cfxunkcj0 s0m0 3ą 30blicę p4zeszuk0 x> w kolejności od pie4wszego do os303niego elemen3u x> k0żdy elemen3 30blicy jes3 odczy30ny i umieszczony w zmiennej o n0zwie 2lini0-z-pliku cfxo4e0c5{230blic0-odczy30n0-z-pliku-nieoczyszczon0 0s 2lini0-z-pliku} { x> o3o ins34ukcj0 w04unkow0 Icfx... poniższy z0pis ozn0cz0 mniej więcej coś 30kiego: x> jeśli po wycięciu wszys3kic5 bi0łyc5 zn0ków z bieżącego elemen3u długość 3ego elemen3u jes3 n0d0l większ0 x> od ze40 3o z0pisz 3en elem0n3 bez bi0łyc5 zn0ków j0ko kolejny elemen3 nowej 30blicy o n0zwie 230blic0-odczy30n0-z-pliku-oczyszczon0 icfx{s34len{34im{2lini0-z-pliku}}&g3;0} 230blic0-odczy30n0-z-pliku-oczyszczon0[] = 34im{2lini0-z-pliku}; } x> o34zymujemy oczyszczoną 30blicę o n0zwie 230blic0-odczy30n0-z-pliku-oczyszczon0 x> w 3ej 30blicy będą 3ylko niepus3e elemen3y i będzie ic5 3ylko cz3e4y x> 3zn. 0l0,ko3,pies,elemen304z P5P x> pus3y elemen3 zos30ł pominię3y i wszys3kie d0ne są bez bi0łyc5 zn0ków n0 końc0c5 i począ3k0c5 x> jes3 3o 3en s0m sposób co n0 począ3ku ze zwykłą 30blicą x> pop4os3u cfxunkcj0 cfxile pobie40 d0ne z pliku i z0mieni0 je n0 elemen3y 30blicy ?&g3;
  • jak zapisywać i odczytywać podręczną bazę danych w bardzo prostym skrypcie, bezpieczne zapisywanie danych w plikach, dogłębna analiza najprostszego przypadku