Лекція № 13
Тема: Операції над рядками. Робота з датою та часом
План
Рядки в РНР
Базові функції для роботи з рядками
Робота з датою і часом
Рядки в РНР
Рядок — це самий універсальний об'єкт в світі РНР. Дуже часто рядки містять числа (як цілі, так і речовинні). Причому РНР дозволяє працювати з такими рядками, як із звичайними числами. Ми можемо «упакувати» в рядок будь-який об'єкт, наприклад, масив і працювати з ним, як з рядком. Як це зробити і для чого це потрібно, ви дізнаєтеся в найостаннішому пункті цього розділу.
Те, що РНР лояльно відноситься до різних типів — це тільки його заслуга (точніше, розробників). Чим же хороші самі рядки в РНР? На відміну від С, переваги PHP-рядків полягають в наступному:
Рядок може містити будь-які символи. Нагадаю, що рядок не може містити символи з кодом 0, оскільки перший такий символ трактується, як кінець рядка.
Рядок може містити довільну кількість символів. Довжина рядка обмежується тільки об'ємом оперативної пам'яті, що дозволяє читати в рядок цілі файли і працювати з ними, як із звичайними рядками, наприклад, порівнювати.
Базовими операціями над рядками є:
Конкатенація рядків (приєднання одного рядка до іншої).
Порівняння рядків.
Конкатенація рядків
У інших мовах програмування, наприклад, мові Pascal, для конкатенації (приєднання) рядків використовується символ «+». Проте в РНР використання оператора «+» некоректно: якщо рядки містять числа, то замість об'єднання рядків, буде виконана операція складання двох чисел. Розглянемо наступний лістинг :
Лістинг. Використання оператора «+» для конкатенації рядків
<?
$а = "20";
$b = "10";
$с = $а + $b; // число + число
echo "?c\n"; // виведе 30
$d = "Hello";
$с = $а + $d; // число + рядок
echo "$c\n"; // виведе 20 ($а)?>
Як бачите, для конкатенації рядків оператор «+» не підходить. Замість нього слід використовувати оператора «.» (крапка) — див. лістинг 9.2.
Лістинг. Коректна конкатенація рядків
<?
Sa = "20";
$b = "10";
$с = $a.$b; // число + число
echo "$c\n"; // виведе' 2010
$d = "Hello";
$с = $a.$d; // число + рядок
echo "$c\n"; // виведе 20Hello
?>
Порівняння рядків
Подібна ситуація з перетворенням типів відбувається і при порівнянні рядків. Оператори порівняння == і != вимагають перетворення типів. Тому вони не повинні використовуватися для порівняння рядків (див. лістинг 9.3).
|
Лістинг. Порівняння рядків
<?
$а = 0;
$b = 1;
if ($а == "") echo "а - порожній рядок";
if ($b == "") echo "b - порожній рядок";
?>
Даний сценарій повідомить нас, що $а — це порожній рядок. Зв'язано це з тим, що порожній рядок "", перш за все, трактується як 0, а тільки потім — як «порожньо». У PHP операнди порівнюються, як рядки, тільки в тому
випадку, якщо обидва вони — рядки. Інакше вони порівнюються, як числа. При цьому будь-який рядок, який інтерпретатору не вдасться перевести в число (у тому числі і порожній рядок), сприйматиметься, як 0.
Можна придумувати деякі обхідні шляхи (брати числа в лапок, щоб вони сприймалися, як рядки, і т.п.), але при цьому дуже висока вірогідність виникнення помилок.
Краще всього при порівнянні використовувати === (потрійний оператор рівності — оператор еквівалентності). Цей оператор завжди дозволяє проводити коректно порівняння, оскільки він порівнює величини і по значенню, і за типом.
Примітка.
Для порівняння рядків можна також використовувати функцію strval(), проте вона володіє певними обмеженнями і особливостями, що робить її використання небажаним. Тому дана функція, починаючи з PHP 4, вже не використовується.
Базові функції роботи з рядками
Функція strlen() повертає довжину рядок, тобто кількість символів, яка містить рядок.
$а = "Hello"; echo strlen($a); // виведе 5
Функція strpos() шукає підрядок в рядку. Функції потрібно передати три параметри:
Рядок, в якому ми шукатимемо підрядок.
Підрядок.
Позицію, починаючи з якої ми шукатимемо. Даний параметрнеобов'язковий і за умовчанням рівний 0 (початок рядка).
Якщо рядок не знайдений, функція повертає false, інакше — номер позиції, з якою починається входження підрядка в рядок:
echo strpos("Hello","el"); // виведе 1
При роботі з даною функцією дуже програмісти, що часто починають, припускаються однієї і тієї ж помилки. Коли я вивчав PHP, я не був виключенням з даного правила. А помилка полягає в наступному. Припустимо, що нам потрібно знайти підрядок ab в рядку abba:
if(strpos("abba","ab")!=false) echo "Рядок ab є в abba";
Очевидно, наш сценарій повинен вивести рядок "Рядок ab є в abba". Проте він нічого не виводить! Річ у тому, що входження рядка ab в рядок abba починається з нульової позиції, а 0 і false при використанні оператора порівняння != є синонімами. Правильніше буде написати так:
if(strpos("abba","ab")!==false) echo "Рядок ab є в abba";
або
if(strpos("abba","ab")===false) echo "Рядка ab немає в abba";
Функція substr(string $str, int $from, int Slength) повертає задану ділянку рядка, тобто підрядок. Повертається підрядок рядка $str, починаючи з позиції $from довжини $length. Якщо параметр $from буде негативним, то відлік підрядка проводитиметься з кінця рядка, а не з початку. Параметр $length є необов'язковим.
$str = "Book";
echo substr($str,l,l); // виведе про
echo substr($str,-l,l); // виведе до
Функція strcmp(Sstrl, Sstr2) порівнює два рядки і повертає наступні значення:
якщо рядки рівні;
якщо рядок $strl лексикографічно більше $str2;— 1, якщо рядок $strl «менше» $str2.
Функція strcasecmp(string Sstrl, string Sstr2) порівнює два рядки без урахування регістра символів, тобто, рядки Book, BOOK і book для цієї функції рівні.
Заміна в рядку
Функція str_replace(Sstrl, Sstr2, Ssource) замінює в рядку $source (яка в процесі роботи функції не змінюється) всі входження підрядка $strl на подтроку $str2 і повертає результат у вигляді нового рядка. Припустимо, що нам потрібно замінити символи нового рядка \n на тег <br>. Це можна зробити так:
$str = str_replace("\n","<br>",$str); або так:
$str = nl2br($str).
Функція nl2br() працює швидше, ніж str_replace, проте вона не враховує символів перекладу каретки, які часто зустрічаються в текстових файлах Windows.
Функція WordWrap() виявляється дуже корисною, якщо нам потрібно відформатувати текст листа перед його облямовуванням. Дана функція розбиває текст на рядки, завершуючи кожну символом розриву (за умовчанням \n). У кожному рядку повинне бути не більше 75 символів (ви можете вказати іншу кількість). Приклад використання функції WordWrap() приведений в лістингу 9.4.
Лістинг 9.4. Використання функції WordWrap()
<?
$s = "Дуже довгий блок тексту, який потрібне .разбить на частини перед відправкою адресатові"; echo $s."\n\n"; // розбиваємо по 15 символів $s = WordWrap($s, 15, "\n"); echo $s;
?>

Мал. 9.1. Результатработи WordWrap
Примітка.
Функція WordWrap не розбиває блок на рядки, як було сказано вище, а лише вставляє символ розриву через задане число символів.
Функція strip_tags(). Дуже корисною є функція strip_tags(), що видаляє з рядка все HTML-теги:
Ви можете вказати, які теги не варто видаляти. Якщо ви не хочете видаляти теги посилань і тег заголовка <head>, тоді вкажіть їх при виклику функції:
$s = strip_tags($s,"<a><head>");
Робота з датою і часом
Практично жоден серйозний проект не обходиться без роботи з датою і часом, тому не приділити увагу функції date() просто неможливо. Функція date (string $format [, int $timestamp]) використовує два параметри:
Формат дати/часу (рядок).
Сама дата (або час) — так званий timestamp.
Функція виводить дату, що відформатувала, на основі другого параметра або на основі поточної дати, якщо параметр Stimestamp не вказаний. Рядок формату може містити звичайний текст, а також модифікатори (див. табл. 10.1), які при висновку замінюються на відповідні значення.
Модифікатори формату функції Date() Таблиця 10.1
Модифікатор
Опис

і
Кількість секунд, що пройшли з півночі 1 січня 1970 року (з моменту підстави Unix)

Y
Рік (4 цифри)

У
Рік (2 цифри)

z
Номер дня від початку року (від «0» до «365»)

F
Повна англійська назва місяця («December»)

m
Номер місяця (2 цифри: від «01» до «12»)

п
Номер місяця без передуючого нуля: від «1» до «12»

М
Трьохсимвольна англійська абревіатура місяця («Dec»)

d
Номер дня в місяці (2 цифри: від «01» до «31»)

j
Номер дня в місяці без передуючого нуля: від «1» до «31»

I
Текстова назва дня тижня по-англійськи, наприклад, «Monday»

w
Номер дня тижня («0» - Неділя, «1» - Понеділок і т.д.)

D
Трьохбуквена англійська абревіатура дня тижня (наприклад, «Моп»)

А
«До» або «пополудні: «AM» або «РМ»

а
«До або «пополудні «am» або «рт»

Н
Годинник (24-годинний формат) від «00» до «23»

h
Годинник (12-годинний формат) від «01» до «12»

i
Хвилини, від «00» до «59»

s
Секунди, від «00» до «59»


Приклади використання функції date():
echo date(''Сегодня d.m.Y'1); echo date(''Дата створення файлу index.html'',filectime(''index.html' '));
При обробці введених параметрів дуже корисною виявиться функція checkdate(), яка перевіряє коректність введеної дати. Функції потрібно передати три параметри — місяць, день і рік (саме у такій послідовності). Дата перевіряється так:
Рік повинен бути не менше 1900 (і не більше 32767).
Місяць повинен бути в діапазоні 1...12.
Число днів повинне відповідати місяцю і року (функція враховує, високосний рік чи ні).
У РНР для роботи з датою і часом є додаткові функції, але розглянуті функцій цілком достатньо для роботи.