GAJDAW


MOJE KSIĄŻKI

Książka pt. Git. Recipes
Książka pt. Git. Rozproszony system kontroli wersji
Książka pt. PhpStorm Starter
Książka pt. Symfony w przykładach
Książka pt. GIMP. Praktyczne projekty. Wydanie II
Książka pt. PHP, MySQL i MVC. Tworzenie witryn WWW opartych na bazie danych
Książka pt. PHP. Praktyczne projekty

PROGRAMY

Funkcje file(), count(), explode(), trim(), czyli krojenie plików tekstowych w PHP

Włodzimierz Gajda

Wykorzystując cztery funkcje PHP: file(), count(), trim() oraz explode() możemy w prosty sposób przetwarzać pliki tekstowe wiersz po wierszu.

1. Funkcja file()

Funkcja file() wczytuje plik o zadanej nazwie do tablicy. Instrukcja:

$mojplik = file('warzywa.txt');

wczyta plik warzywa.txt do zmiennej $mojplik. Zmienna $mojplik jest tablicą o zawartości:

$mojplik[0]    - pierwsza linia pliku warzywa.txt
$mojplik[1]    - druga linia pliku warzywa.txt
$mojplik[2]    - trzecia linia pliku warzywa.txt
...

Do elementów utworzonej tablicy (zawierających teraz kolejne linie z pliku warzywa.txt) możemy odwoływać się wykorzystując indeksy:

//linia nr 4 pliku warzywa.txt
$mojplik[3]

//wysyłamy linijkę do klienta
echo $mojplik[3];


//linia nr 9 pliku warzywa.txt
$mojplik[8]

//wysyłamy linijkę do klienta
echo $mojplik[8];

Jako indeks możemy użyć zmiennej:

//linia nr 8 pliku warzywa.txt
$i = 7;
$mojplik[$i]

//wysyłamy linijkę do klienta
echo $mojplik[$i];


//linia nr 4 pliku warzywa.txt
$numerlinii = 3;
$mojplik[$numerlinii]

//wysyłamy linijkę do klienta
echo $mojplik[$numerlinii];

Jeśli plik warzywa.txt zawiera linie:

FASOLA
CEBULA
GROCH
KAPUSTA
POMIDOR
SELER
POR

to po wywołaniu:

$mojplik = file('warzywa.txt');

tablica $mojplik będzie zawierała:

$mojplik[0]  ==  FASOLA
$mojplik[1]  ==  CEBULA
$mojplik[2]  ==  GROCH
$mojplik[3]  ==  KAPUSTA
$mojplik[4]  ==  POMIDOR
$mojplik[5]  ==  SELER
$mojplik[6]  ==  POR

UWAGA: napisy z tablicy $mojplik zawierają na końcu znak przejścia do nowej linii! W celu usunięcia znaków przejścia do nowej linii należy skorzystać z funkcji trim() opisanej poniżej.

2. Funkcja count()

Funkcja count() zwraca jako wynik liczbę elementów tablicy. Instrukcja:

$mojplik = file('warzywa.txt');
echo count($mojplik);

wydrukuje na ekranie liczbę elementów tablicy $mojplik, równą liczbie wierszy pliku warzywa.txt.

3. Funkcja explode()

Funkcja explode() dzieli zadany napis podanym znakiem (lub napisem) na tablicę. Jeśli zmiennej $tab przypiszemy wartość:

$zm = 'ala,ma,kota';

wówczas instrukcja:

$tab = explode(',', $zm);

pokroi napis 'ala,ma,kota' na napisy 'ala', 'ma' oraz 'kota' i umieści je w tablicy $tab:

//teraz:
//  $tab[0] == 'ala'
//  $tab[1] == 'ma'
//  $tab[2] == 'kota'

Pierwszym parametrem funkcji explode() jest napis, którym „kroimy” (w przykładzie jest to przecinek). Drigim parametrem jest napis, który kroimy (w przykładzie tekst ala,ma,kota).

Napis, którym kroimy (w powyższym przykładzie przecinek) nie występuje w żadnym elemencie otrzymanej tablicy.

Po pokrojeniu napisu 'ANKA MA KOTA I KOSA' znakiem K otrzymamy cztery człony: pierwszy — 'AN', drugi — 'A MA ', trzeci — 'OTA I ' oraz czwarty — 'OSA':

$zm = 'ANKA MA KOTA I KOSA';

$tab = explode('K', $zm);

//teraz:
//       $tab[0] == 'AN'
//       $tab[1] == 'A MA '
//       $tab[2] == 'OTA I '
//       $tab[3] == 'OSA'

4. Funkcja trim()

Funkcja trim() usuwa białe z początku i z końca napisu. Białym znakiem jest dowolny spośród znaków przedstawionych w tabeli 1.

lp. Nazwa znaku Dziesiętny kod ASCII Znak w napisie PHP
1. spacja 32 " "
2. tabulator 9 "\t"
3. znak nowej linii 10 "\n"
4. powrót karetki 13 "\r"
5. znak NULL 0 "\0"
6. pionowy tabulator 11 "\x0B"

Tabela 1. Znaki usuwane przez funkcję trim()

Zmienna:

$zm = "    \n\n    ala\n   ma\n   kota\n\n  \n";

po wywołaniu

$zm = trim($zm);

przyjmie wartość

$zm == "ala\n   ma\n   kota";

UWAGA: w PHP od wersji 4.0.7 funkcja trim() posiada drugi opcjonalny parametr: znaki do usunięcia. Wywołanie:

$zm = trim($zm, 'al');

spowoduje, usunięcie ze zmiennej $zm wiodących i końcowych znaków a oraz l. Po wywołaniu tym zmienna $zm przyjmie wartość:

$zm == "ma\n   kot";

5. Przetworzenie tablicy element po elemencie

Oto przykład demonstrujący przetwarzanie wszystkich elementów tablicy $tab. Drukujemy kolejne elementy tablicy, oddzielając je znakiem nowego wiersza.

5.1 Przykład 1

<?php
$tab[0] = 'Witaj';
$tab[1] = 'kolego';
$tab[2] = 'na';
$tab[3] = 'mojej';
$tab[4] = 'stronie';
$tab[5] = '!!!';

$tmpcount = count($tab);
for ($i = 0; $i < $tmpcount; $i++) {
    echo $tab[$i];
    echo "\n";
}
?>

Po wykonaniu operacji Widok → Źródło, zobaczymy następujący kod:

Witaj
kolego
na
mojej
stronie
!!!

Nie należy stosować wywołania funkcji count() wewnątrz instrukcji for, gdyż w takim wypadku każdy obrót pętli będzie się kończył (niepotrzebnym) wywoływaniem funkcji count(). Poniższe rozwiązanie jest nieoptymalne i nie należy go stosować:

ROZWIĄZANIE NIEOPTYMALNE
for ($i = 0; $i < count($tab); $i++) {
    //tutaj przetwarzanie np. wydruk
    echo $tab[$i];
}

6. Przetwarzanie pliku tekstowego wiersz po wierszu

Oto przykład demonstrujący przetwarzanie pliku tekstowego linia po linii. Na ekranie drukujemy kolejno wszystkie linie pliku tekstowego warzywa.txt. Każdą linię poprzedzamy numerem.

6.1 Przykład 2

<?php
$plk      = file('warzywa.txt');
$tmpcount = count($plk);
for ($i = 0; $i < $tmpcount; $i++) {
    echo $i;
    echo ' ';
    echo trim($plk[$i]);
    echo '<br />';
    echo "\n";
}
?>

Jeśli w pliku znajdują się wyrazy:

FASOLA
CEBULA
GROCH
KAPUSTA
POMIDOR
SELER
POR

to wynikiem działania skryptu z przykładu 2 będzie wydruk:

0 FASOLA<br />
1 CEBULA<br />
2 GROCH<br />
3 KAPUSTA<br />
4 POMIDOR<br />
5 SELER<br />
6 POR<br />

Należy zwrócić uwagę na użycie funkcji trim() oraz wydruk znaku złamania wiersza "\n".

6.2 Przykład 3

Kilka instrukcji echo występujących w przykładzie 2:

echo $i;
echo ' ';
echo trim($plk[$i]);
echo '<br />';
echo "\n";

możemy zastąpić jedną instrukcją:

echo $i . ' ' . trim($plk[$i]) .
    '<br />' . "\n";

Operator . (kropka) w języku PHP łączy napisy. Przykład drugi przyjmie wówczas postać:

<?php
$plk      = file('warzywa.txt');
$tmpcount = count($plk);
for ($i = 0; $i < $tmpcount; $i++) {
    echo $i . ' ' . trim($plk[$i]) .
         '<br />' . "\n";
}
?>

7. „Krojenie” pliku tekstowego

7.1 Przykład 4

Plik tekstowy slownik.txt o zawartości:

pies:dog
kot:cat
lis:fox
sowa:owl
krowa:cow
ptak:bird
wilk:wolf
sroka:magpie
kura:hen
prosiak:pig

przetwarzamy linia po linii. Każdą linijkę kroimy znakiem dwukropka, po czym drukujemy na ekranie w postaci:

PL: pies<br />EN: dog<br /><br />
PL: kot<br />EN: cat<br /><br />
PL: lis<br />EN: fox<br /><br />
PL: sowa<br />EN: owl<br /><br />
PL: krowa<br />EN: cow<br /><br />
PL: ptak<br />EN: bird<br /><br />
PL: wilk<br />EN: wolf<br /><br />
PL: sroka<br />EN: magpie<br /><br />
PL: kura<br />EN: hen<br /><br />
PL: prosiak<br />EN: pig<br /><br />
<?php
$p = file('slownik.txt');
$tmpcount = count($p);
for ($i = 0; $i < $tmpcount; $i++) {
    $l = explode(':', trim($p[$i]));
    echo 'PL: ';
    echo $l[0];
    echo '<br />EN: ';
    echo $l[1];
    echo '<br /><br />';    
    echo "\n";
}
?>

7.2 Przykład 5

Kilka instrukcji echo występujących w przykładzie 4 możemy zastąpić jedną instrukcją i operatorem do konkatenacji (tj. łączenia) napisów:

<?php
$p = file('slownik.txt');
$tmpcount = count($p);
for ($i = 0; $i < $tmpcount; $i++) {
    $l = explode(':', trim($p[$i]));
    echo 'PL: ' . $l[0] . '<br />EN: ' . 
        $l[1] . '<br /><br />' . "\n";
}
?>

Należy pamiętać o użyciu funkcji trim(). W przeciwnym razie wyniki będą następujące:

PL: pies<br />EN: dog
<br /><br />
PL: kot<br />EN: cat
<br /><br />
PL: lis<br />EN: fox
<br /><br />
PL: sowa<br />EN: owl
<br /><br />
PL: krowa<br />EN: cow
<br /><br />
PL: ptak<br />EN: bird
<br /><br />
PL: wilk<br />EN: wolf
<br /><br />
PL: sroka<br />EN: magpie
<br /><br />
PL: kura<br />EN: hen
<br /><br />
PL: prosiak<br />EN: pig<br /><br />

W pliku slownik.txt po angielskim wyrazie (np. dog) znajduje się koniec wiersza, czyli znak "\n" lub dwa znaki "\r\n". Funkcja trim() usuwa te znaki.


Reklama

Szkolenia z Zend Framework 2.0