PHP: Обход строк
Циклы подходят не только для обработки чисел, но и при работе со строками — и это благодаря возможности получить конкретный символ по его индексу. Ниже пример кода, который распечатывает буквы каждого слова на отдельной строке:
<?php
function printNameBySymbol(string $name): void
{
$i = 0;
// Такая проверка будет выполняться до конца строки,
// включает последний символ
// Его индекс — `длина строки - 1`
while ($i < strlen($name)) {
// Обращаемся к символу по индексу
print_r("$name[$i]\n");
$i = $i + 1;
}
}
$name = 'Arya';
printNameBySymbol($name);
// => 'A'
// => 'r'
// => 'y'
// => 'a'Цикл проходит по каждому символу строки по очереди:
'Arya'
│ │ │ │
A r y a
↓ ↓ ↓ ↓
каждый символ обрабатывается по очередиСамое главное в этом коде — поставить правильное условие в while. Это можно сделать сразу двумя способами:
$i < strlen($name)$i <= strlen($name) - 1
Оба способа приводят к одному результату.
Переворот строки
Вместо печати можно собирать новую строку. Например, напишем функцию, которая переворачивает строку:
<?php
function reverseString(string $text): string
{
$result = '';
$i = strlen($text) - 1;
while ($i >= 0) {
$result = $result . $text[$i];
$i = $i - 1;
}
return $result;
}
print_r(reverseString('Arya') . "\n"); // => ayrA
print_r(reverseString('hexlet') . "\n"); // => telxehПеременная $result инициализируется пустой строкой как нейтральным элементом для конкатенации. Цикл начинается с последнего индекса (strlen($text) - 1), двигается к нулю и завершается, когда индекс становится меньше нуля. На каждом шаге к результату добавляется текущий символ. В итоге строка строится в обратном порядке.
Задание
Напишите функцию maskCardNumber(), которая скрывает номер банковской карты. Функция должна заменить все символы строки на *, кроме последних четырех.
Пример работы:
<?php
maskCardNumber('1234567812345678'); // '************5678'
maskCardNumber('12345678'); // '****5678'PHP: Обход строк
Циклы подходят не только для обработки чисел, но и при работе со строками — и это благодаря возможности получить конкретный символ по его индексу. Ниже пример кода, который распечатывает буквы каждого слова на отдельной строке:
<?php
function printNameBySymbol(string $name): void
{
$i = 0;
// Такая проверка будет выполняться до конца строки,
// включает последний символ
// Его индекс — `длина строки - 1`
while ($i < strlen($name)) {
// Обращаемся к символу по индексу
print_r("$name[$i]\n");
$i = $i + 1;
}
}
$name = 'Arya';
printNameBySymbol($name);
// => 'A'
// => 'r'
// => 'y'
// => 'a'Цикл проходит по каждому символу строки по очереди:
'Arya'
│ │ │ │
A r y a
↓ ↓ ↓ ↓
каждый символ обрабатывается по очередиСамое главное в этом коде — поставить правильное условие в while. Это можно сделать сразу двумя способами:
$i < strlen($name)$i <= strlen($name) - 1
Оба способа приводят к одному результату.
Переворот строки
Вместо печати можно собирать новую строку. Например, напишем функцию, которая переворачивает строку:
<?php
function reverseString(string $text): string
{
$result = '';
$i = strlen($text) - 1;
while ($i >= 0) {
$result = $result . $text[$i];
$i = $i - 1;
}
return $result;
}
print_r(reverseString('Arya') . "\n"); // => ayrA
print_r(reverseString('hexlet') . "\n"); // => telxehПеременная $result инициализируется пустой строкой как нейтральным элементом для конкатенации. Цикл начинается с последнего индекса (strlen($text) - 1), двигается к нулю и завершается, когда индекс становится меньше нуля. На каждом шаге к результату добавляется текущий символ. В итоге строка строится в обратном порядке.
Задание
Напишите функцию maskCardNumber(), которая скрывает номер банковской карты. Функция должна заменить все символы строки на *, кроме последних четырех.
Пример работы:
<?php
maskCardNumber('1234567812345678'); // '************5678'
maskCardNumber('12345678'); // '****5678'Ваше упражнение проверяется по этим тестам
<?php
namespace HexletBasics\Loops\IterationOverString;
use HexletBasics\Exercise\TestCase;
class SolutionTest extends TestCase
{
public function test()
{
$this->assertEquals('************5678', maskCardNumber('1234567812345678'));
$this->assertEquals('****5678', maskCardNumber('12345678'));
$this->assertEquals('************3333', maskCardNumber('0000111122223333'));
}
}Решение учителя откроется через:
20:00
