«Единственный способ творить великие дела – это любить то, что ты делаешь»
PHP


Задачи на работу с файлами в PHP

Работа с файлами - Задачи

См. также Работа с файлами - Теория

Задача №1
Удалить из строки повторяющиеся символы, если они следуют друг за другом.

Функция strlen() - возвращает количество в строке (длину строки).
Функция strlen() - неправильно работает с кириллицей.
Функция mb_strlen() - работает также, как и функция strlen(), но корректно обрабатывает кириллицу.

Приведены 2 решения Задачи №1
1-решение более компактное и применимо в тех случаях, когда ведется работа со строкой на Латинице.
Если строка будет состоять из символов русского алфавита, то мы не получим нужного результата.
2-решение - для любых строк: как на Латинице, так и для русского алфавита.
Во 2-м решении задействована функция mb_substr, которая возвращает часть строки.
В нашем случае mb_substr($str, $i, 1) - мы вырезаем/берем один (1) - текущий ($i) символ строки $str.

Есть функция функция substr, которая также возвращает часть строки.
Но мы используем именно функцию mb_substr.
Приставка mb функции mb_substr - позволяет корректно работать с символами на Кириллице.

Задача №2
В полученной строке найти самое длинное слово. Для этого нужно:
1. Считать строку
2. Разбить строку на слова
3. Каждое слово занести в массив

Самое главное - продумать алгоритм разбивки строки на слова. Как это сделать?
Добрый день. Мы изучаем язык программирования PHP - это исходная строка.

Чтобы разбить строку на слова мы снова будем работать с текущим и предыдущим символом.
Как понять, что слово начинается?
1. У первого слова: текущий символ равен букве (это можно записать, как НЕ равен пробелу), а предыдущий - пустоте.
2. У каждого последующего слова: текущий символ равен букве, а предыдущий - пробелу.
3. При совпадении этих условий - делаем вывод, что слово начинается.
Как понять, что слово заканчивается?
1. У последнего слова: предыдущий символ равен букве, а текущий - пустоте.
2. У других слов: предыдущий символ равен букве, а текущий - пробелу.
3. При совпадении этих условий - делаем вывод, что слово заканчивается.

PHP-код

// Считываем из файла строку. Код взят со страницы "Работа с файлами - Теория"
	$f = fopen("test.txt", "r");
	$str = "";
	while(!feof($f)){
		$str = fgets($f);
	}
	echo "Задача №1<br>";
	echo $str;
	
// Задача №1 - Удалить из строки повторяющиеся символы
    // Решение для строки на Латинице
	
	// Инициализация переменных - текущий символ, предыдущий символ и новая строка
	/* $char = $prevChar = $strNew = "";
	for($i=0; $i<strlen($str); $i++){
		$char = $str[$i]; // текущий символ строки
		if($char != $prevChar) $strNew .= $char; // Заносим в новую строку символ, если он НЕ равен предыдущему
		$prevChar = $char; // Запоминаем текущий символ. Он будет предыдущим при следующей итерации
	}
	echo "<br>";
	echo $strNew; */
	
// Задача №1 - Решение для любой строки: как на Латинице, так и на Кириллице
	$char = $prevChar = $strNew = "";
	for($i=0; $i<strlen($str); $i++){
		$char = mb_substr($str, $i, 1); // текущий символ строки
		if($char != $prevChar) $strNew .= $char; // Заносим в новую строку символ, если он НЕ равен предыдущему
		$prevChar = $char; // Фиксируем текущий символ - он будет предыдущим при следующей итерации
	}
	echo "<br>";
	echo $strNew;
	
	echo "<p>";
	
// Задача №2 - Самое длинное слово строки
	echo "Задача №2<br>";
// Этап 1-ый создаем массив из слов
	$char = $prevChar = "";
	$arWords = [];
	for($i=0; $i<=mb_strlen($str); $i++){
		$char = mb_substr($str, $i, 1); 
		// Условие, при котором начинается новое слово
		if (($prevChar=='' || $prevChar==' ') && $char!=' '){
			$word = ""; // и далее см. строку 48...
		}
		// Условие, при котором слово заканчивается
		if ($prevChar!=' ' && ($char==' ' || $char=='')) {
			$arWords[] = $word; // Слово заносится в массив
		}
		$word .= $char; // ...в переменную/в слово заносится текущий символ
		$prevChar = $char;
	}
	print_r($arWords);
	// Чтобы в массив вошло последнее слово PHP в условии цикла счетчик $i должен быть меньше или равен длине строки
	// Стоит также обратить внимание, что в условии цикла используется функция mb_strlen()
	echo "<br>";
// Этап 2-ой - Ищем самое длинное слово массива
	$max = 0;
	foreach($arWords as $key=>$value){
		if($max < mb_strlen($arWords[$key])){
		   $max = mb_strlen($arWords[$key]);
		   $maxWord = $arWords[$key];
		}
	}
	echo "Самое длинное слово в строке '$maxWord' - число символов ".$max;

Результат

Задача №1
Добрый день мы изучаем язык программирования PHP
Добрый день мы изучаем язык програмирования PHP

Задача №2
Array ( [0] => Добрый [1] => день [2] => мы [3] => изучаем [4] => язык [5] => программирования [6] => PHP )
Самое длинное слово в строке 'программирования' - число символов 16