PHP: Агрегация данных (Строки)
Агрегация применяется не только к числам, но и к строкам. Это такие задачи, в которых строка формируется динамически — то есть заранее неизвестно, какого она размера и что будет содержать.
Представьте себе функцию, которая умеет умножать строку, то есть повторять ее указанное количество раз:
<?php
repeat('hexlet', 3); // 'hexlethexlethexlet'Принцип работы этой функции довольно простой — в цикле происходит «наращивание» строки указанное количество раз:
<?php
function repeat(string $text, int $times): string
{
// Нейтральный элемент для строк – пустая строка
$result = '';
$i = 1;
while ($i <= $times) {
// Каждый раз добавляем строку к результату
$result = "{$result}{$text}";
$i = $i + 1;
}
return $result;
}Распишем выполнение этого кода по шагам:
<?php
// Для вызова repeat('hexlet', 3);
$result = '';
$result = "{$result}hexlet"; // hexlet
$result = "{$result}hexlet"; // hexlethexlet
$result = "{$result}hexlet"; // hexlethexlethexletНаглядно процесс наращивания строки выглядит так:
repeat('hexlet', 3):
i=1: result = '' . 'hexlet' = 'hexlet'
i=2: result = 'hexlet' . 'hexlet' = 'hexlethexlet'
i=3: result = 'hexlethexlet' . 'hexlet' = 'hexlethexlethexlet'
└── результатНейтральный элемент
Чтобы наращивание работало, нужно стартовое значение. Для строк таким значением является пустая строка ''.
Она называется нейтральным элементом, потому что при конкатенации ничего не меняет:
<?php
print_r('' . 'abc'); // => abc
print_r('abc' . ''); // => abcПоэтому именно пустая строка всегда используется как начальное значение при агрегации строк.
Задание
Реализуйте функцию sanitizePhoneNumber(), которая принимает номер телефона из формы и возвращает строку без пробелов, скобок и дефисов.
Пользователи вводят номера по-разному, но перед сохранением их часто приводят к одному виду. Пройдите исходную строку посимвольно и соберите новый номер только из полезных символов.
<?php
sanitizePhoneNumber('+7 (999) 123-45-67'); // '+79991234567'
sanitizePhoneNumber('8 800 555 35 35'); // '88005553535'
sanitizePhoneNumber('(123) 456-7890'); // '1234567890'Подсказки
- Итоговый результат — строка.
- Используйте пустую строку как начальное значение.
- Проверить, входит ли символ в набор
' ()-', поможет функцияstr_contains().
PHP: Агрегация данных (Строки)
Агрегация применяется не только к числам, но и к строкам. Это такие задачи, в которых строка формируется динамически — то есть заранее неизвестно, какого она размера и что будет содержать.
Представьте себе функцию, которая умеет умножать строку, то есть повторять ее указанное количество раз:
<?php
repeat('hexlet', 3); // 'hexlethexlethexlet'Принцип работы этой функции довольно простой — в цикле происходит «наращивание» строки указанное количество раз:
<?php
function repeat(string $text, int $times): string
{
// Нейтральный элемент для строк – пустая строка
$result = '';
$i = 1;
while ($i <= $times) {
// Каждый раз добавляем строку к результату
$result = "{$result}{$text}";
$i = $i + 1;
}
return $result;
}Распишем выполнение этого кода по шагам:
<?php
// Для вызова repeat('hexlet', 3);
$result = '';
$result = "{$result}hexlet"; // hexlet
$result = "{$result}hexlet"; // hexlethexlet
$result = "{$result}hexlet"; // hexlethexlethexletНаглядно процесс наращивания строки выглядит так:
repeat('hexlet', 3):
i=1: result = '' . 'hexlet' = 'hexlet'
i=2: result = 'hexlet' . 'hexlet' = 'hexlethexlet'
i=3: result = 'hexlethexlet' . 'hexlet' = 'hexlethexlethexlet'
└── результатНейтральный элемент
Чтобы наращивание работало, нужно стартовое значение. Для строк таким значением является пустая строка ''.
Она называется нейтральным элементом, потому что при конкатенации ничего не меняет:
<?php
print_r('' . 'abc'); // => abc
print_r('abc' . ''); // => abcПоэтому именно пустая строка всегда используется как начальное значение при агрегации строк.
Задание
Реализуйте функцию sanitizePhoneNumber(), которая принимает номер телефона из формы и возвращает строку без пробелов, скобок и дефисов.
Пользователи вводят номера по-разному, но перед сохранением их часто приводят к одному виду. Пройдите исходную строку посимвольно и соберите новый номер только из полезных символов.
<?php
sanitizePhoneNumber('+7 (999) 123-45-67'); // '+79991234567'
sanitizePhoneNumber('8 800 555 35 35'); // '88005553535'
sanitizePhoneNumber('(123) 456-7890'); // '1234567890'Подсказки
- Итоговый результат — строка.
- Используйте пустую строку как начальное значение.
- Проверить, входит ли символ в набор
' ()-', поможет функцияstr_contains().
Ваше упражнение проверяется по этим тестам
<?php
namespace HexletBasics\Loops\AggregationStrings;
use HexletBasics\Exercise\TestCase;
class SolutionTest extends TestCase
{
public function test()
{
$this->assertEquals('+79991234567', sanitizePhoneNumber('+7 (999) 123-45-67'));
$this->assertEquals('88005553535', sanitizePhoneNumber('8 800 555 35 35'));
$this->assertEquals('1234567890', sanitizePhoneNumber('(123) 456-7890'));
}
}Решение учителя откроется через:
20:00
