@sul_evil

Что означает этот фрагмент кода?

Всем здравствуйте, не могли бы вы объяснить простым языком что они значат?
function reverse_vowels($word) {
    $vowels = implode(array_filter(str_split($word),
              function ($c) {
                  return preg_match('/[ayeiou]/i', $c);
              }));

1. А именно, '/[ayeiou]/i' - почему стоит i после шаблона? какую роль он исполняет, я его удалял но код продолжал корректно работать.
2. Я знаю что preg_match проверяет соответствие шаблона с входной строкой, но что здесь $c?

function ($i) use ($word, $vowels, &$v)
3. Что означает &$v, а именно &
Заранее спасибо за ответ!

А вот полный код
function reverse_vowels($word) {
    $vowels = implode(array_filter(str_split($word),
              function ($c) {
                  return preg_match('/[ayeiou]/i', $c);
              }));
    $v = 0;
    $reverse = implode(array_map(
              function ($i) use ($word, $vowels, &$v) 
        {
                 $is_vowel = preg_match('/[ayeiou]/', $word[$i]);
                 return $is_vowel ? $vowels[strlen($vowels) - 1 - $v++] : $word[$i];
              }, 
        range(0, strlen($word) - 1)));
    return $reverse;
}
  • Вопрос задан
  • 327 просмотров
Решения вопроса 4
FanatPHP
@FanatPHP
Чебуратор тега PHP
Вот за такой код очень хочется бить по голове некоторых местных икспердов, которых хлебом не корми, но дай повыделываться и показать немерянные ум и сообразительность.

В то время как нормальный код должен выглядеть вот так
function reverse_vowels($word) {
    $vowels = [];
    foreach(str_split($word) as $c) {
        if (preg_match('/[ayeiou]/i', $c)) {
            $vowels[] = $c;
        }
    }
    $v = 0;
    $reverse = '';
    for ($i=0; $i < strlen($word); $i++) {
        $is_vowel = preg_match('/[ayeiou]/i', $word[$i]);
        $reverse .=  $is_vowel ? $vowels[count($vowels) - 1 - $v++] : $word[$i];
    }
    return $reverse;
}

который не вызывает вообще никаких вопросов

Плюс по-хорошему можно первый цикл заменить на
preg_match_all('/[ayeiou]/i', $word, $matches);
$vowels = $matches[0];
Ответ написан
rozhnev
@rozhnev
Fullstack programmer, DBA, медленно, дорого
Не благодарите :)
<?php
function reverse_vowels($word)
{
    // получаем строку всех гласных букв. в слове
	$vowels = implode( // объединяем массив в строку
        array_filter(// получаем массив всех гласных букв. в слове
			str_split($word), // разбиваем слово на буквы
			function ($c) { // проверяем если буква гласная [ayeiou]
            	return preg_match("/[ayeiou]/i", $c);
        	}
		)
    );
	
	echo "" . $vowels . PHP_EOL;
	
    $v = 0;
    $reverse = implode(// объединяем массив в строку
        array_map(
			function ($i) use ($word, $vowels, &$v) {// &$v переменная переданная по ссылке
            	$is_vowel = preg_match("/[ayeiou]/", $word[$i]);
            	return $is_vowel ? $vowels[strlen($vowels) - 1 - $v++] : $word[$i];
        	}, 
			range(0, strlen($word) - 1) // массив [0, количество букв в слове - 1]
		)
    );
    return $reverse;
}


echo reverse_vowels('environment');


PHP code online
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы