массивы — простая строковая мутация в переполнении стека

Для моего кода я хочу иметь строковую мутацию, только если следующее слово «красный». И нет, в этом нет никакой логики, но это должен быть простой случай для сложного.
Поэтому я использовал next() но если последнее слово «красный», то оно не работает.

Мой код:

$input = ['man', 'red', 'apple', 'ham', 'red'];
$endings = ['m', 'n'];

$shouldRemove = false;
foreach ($input as $key => $word) {
// if this variable is true, it will remove the first character of the current word.
if ($shouldRemove === true) {
$input[$key] = substr($word, 1);
}

// we reset the flag
$shouldRemove = false;
// getting the last character from current word
$lastCharacterForCurrentWord = $word[strlen($word) - 1];

if (in_array($lastCharacterForCurrentWord, $endings) && next($input) == "red") {
// if the last character of the word is one of the flagged characters,
// we set the flag to true, so that in the next word, we will remove
// the first character.
$shouldRemove = true;
}
}

var_dump($input);

Как уже упоминалось для последнего «красного», вместо того, чтобы получить «Эд», я получаю «красный» Что я должен сделать, чтобы получить желаемый результат?

1

Решение

Вы можете выбрать следующий ключ «вручную»:

$input = ['man', 'red', 'apple', 'ham', 'red'];
$endings = ['m', 'n'];

$shouldRemove = false;
foreach ($input as $key => $word) {
// if this variable is true, it will remove the first character of the current word.
if ($shouldRemove === true) {
$input[$key] = substr($word, 1);
}

// we reset the flag
$shouldRemove = false;
// getting the last character from current word
$lastCharacterForCurrentWord = $word[strlen($word) - 1];

if (in_array($lastCharacterForCurrentWord, $endings) && $input[$key+1] == "red") {
// if the last character of the word is one of the flagged characters,
// we set the flag to true, so that in the next word, we will remove
// the first character.
$shouldRemove = true;
}
}

var_dump($input);

array (5) {[0] => string (3) «man» [1] => string (2) «ed» [2] => string (5) «apple» [3] => string (3) «ham» [4] => string (2) «ed»}

0

Другие решения

Причина, по которой он не работает, заключается в том, что он использует следующую итерацию цикла, чтобы делать то, что вам нужно, на основе вашей оценки в текущей итерации. Если элемент, который вы хотите изменить, является последним элементом в массиве, следующей итерации с ним не будет.

Вместо проверки следующего слова вы можете отслеживать предыдущее слово и использовать его.

$previous = '';
foreach ($input as $key => $word) {
if ($word == 'red' && in_array(substr($previous, -1), $endings)) {
$input[$key] = substr($word, 1);
}
$previous = $word;
}
1

По вопросам рекламы [email protected]