Włodzimierz Gajda

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

1. Funkcja file

Funkcja file() wczytuje zadany plik do tablicy. Instrukcja:

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

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

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

Oczywiście do elementów tablicy (zawierających teraz kolejne linie z pliku dane.txt) możemy odwoływać się stosując zmienne:

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

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


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

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

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('dane.txt');
echo count($mojplik);

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

3. Funkcja explode

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

$zm = 'ala,ma,kota';

wówczas instrukcja:

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

podzieli 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” drugi parametrem (również napis). Przykład drugi:

$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'

Funkcja explode() stanowi bardzo wygodne narzędzie do tworzenia menu na podstawie plików tekstowych.

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.

znak   |   kod   |   ASCII
---------------------------------------
" "    |    32   |   spacja
"\t"   |     9   |   tabulator
"\n"   |    10   |   znak nowej linii
"\r"   |    13   |   powrót karetki
"\0"   |     0   |   znak NULL
"\x0B" |    11   |   pionowy tabulator

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.

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(). Rozwiązanie takie jest nieoptymalne. Błędne użycie funkcji count() oznaczono tłustą czerwoną czcionką.

Przykład niepoprawny

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

6. Przetwarzanie pliku tekstowego

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

Przykład 2.

<?php
$plk      = file('dane.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".

Kilka instrukcji echo możemy zastąpić jedną.

Przykład 3.

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

7. „Krojenie” pliku tekstowego

Plik tekstowy 00index.log o zawartości:

Androny:androny.txt
Arbuz:arbuz.txt
Baran:baran.txt
Brudas:brudas.txt
Chrzan:chrzan.txt
Chrząszcz:chrzaszcz.txt
Ciaptak:ciaptak.txt
Ćwikła:cwikla.txt
Depesza:depesza.txt
Drzewa:drzewa.txt
Foka:foka.txt

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

TYTUŁ: "Androny" PLIK: "androny.txt"
TYTUŁ: "Arbuz" PLIK: "arbuz.txt"
TYTUŁ: "Baran" PLIK: "baran.txt"
TYTUŁ: "Brudas" PLIK: "brudas.txt"
TYTUŁ: "Chrzan" PLIK: "chrzan.txt"
TYTUŁ: "Chrząszcz" PLIK: "chrzaszcz.txt"
TYTUŁ: "Ciaptak" PLIK: "ciaptak.txt"
TYTUŁ: "Ćwikła" PLIK: "cwikla.txt"
TYTUŁ: "Depesza" PLIK: "depesza.txt"
TYTUŁ: "Drzewa" PLIK: "drzewa.txt"
TYTUŁ: "Foka" PLIK: "foka.txt"

Przykład 4.

<?php
$p = file('00index.log');
$tmpcount = count($p);
for ($i = 0; $i < $tmpcount; $i++) {
    $l = explode(':', trim($p[$i]));
    echo 'TYTUŁ: "';
    echo $l[0];
    echo '" PLIK: "';
    echo $l[1];
    echo '"';
    echo '<br />';
    echo "\n";
}
?>

Kilka instrukcji echo możemy zastąpić jedną.

Przykład 5.

<?php
$p = file('00index.log');
$tmpcount = count($p);
for ($i = 0; $i < $tmpcount; $i++) {
    $l = explode(':', trim($p[$i]));
    echo 'TYTUŁ: "' . $l[0] . '" PLIK: "' .
          $l[1] . '"' . '<br />' . "\n";
}
?>

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

TYTUŁ: "Androny" PLIK: "androny.txt
"
TYTUŁ: "Arbuz" PLIK: "arbuz.txt
"
TYTUŁ: "Baran" PLIK: "baran.txt
"
TYTUŁ: "Brudas" PLIK: "brudas.txt
"
TYTUŁ: "Chrzan" PLIK: "chrzan.txt
"
TYTUŁ: "Chrząszcz" PLIK: "chrzaszcz.txt
"
TYTUŁ: "Ciaptak" PLIK: "ciaptak.txt
"
TYTUŁ: "Ćwikła" PLIK: "cwikla.txt
"
TYTUŁ: "Depesza" PLIK: "depesza.txt
"
TYTUŁ: "Drzewa" PLIK: "drzewa.txt
"
TYTUŁ: "Foka" PLIK: "foka.txt
"

W pliku 00index.log po nazwie pliku (np. androny.txt) znajduje się koniec wiersza, czyli znak "\n" lub dwa znaki "\r\n". Funkcja trim() usuwa te znaki.

©2007 Włodzdimierz Gajda