Для моего кода я хочу иметь строковую мутацию, только если следующее слово «красный». И нет, в этом нет никакой логики, но это должен быть простой случай для сложного.
Поэтому я использовал 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);
Как уже упоминалось для последнего «красного», вместо того, чтобы получить «Эд», я получаю «красный» Что я должен сделать, чтобы получить желаемый результат?
Вы можете выбрать следующий ключ «вручную»:
$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»}
Причина, по которой он не работает, заключается в том, что он использует следующую итерацию цикла, чтобы делать то, что вам нужно, на основе вашей оценки в текущей итерации. Если элемент, который вы хотите изменить, является последним элементом в массиве, следующей итерации с ним не будет.
Вместо проверки следующего слова вы можете отслеживать предыдущее слово и использовать его.
$previous = '';
foreach ($input as $key => $word) {
if ($word == 'red' && in_array(substr($previous, -1), $endings)) {
$input[$key] = substr($word, 1);
}
$previous = $word;
}