#php
Вопрос:
В настоящее время я пытаюсь сгруппировать совпадающие пары, например, если это a
и b
в строке, это должно стать одним элементом.
Моя попытка возвращается:
['a', 'b', 'a', 'b', 'a']
$test = [
'a',
'b',
'a',
'b',
'a',
'a',
'a'
];
$result = [];
for ($i = 0; $i < count($test); $i ) {
if ($i === 0 || $test[$i] !== $test[$i 1 !== count($test) ? $i 1 : 0]) {
$result[] = $test[$i];
}
}
dd($result);
Желаемый результат:
['a', 'ba', 'ba', 'a', 'a']
Комментарии:
1. Например, если
['b', 'a']
это должно стать['ba']
2. Я читал этот вопрос несколько раз. Ваш желаемый результат не имеет смысла. Не соответствует тому, о чем вы спрашиваете.
3. Что вы имеете в виду под совпадающими парами? Вы имеете в виду, что если это не первое и то, что следует за этим, это НЕ одно и то же?
Ответ №1:
Если последний элемент b
и текущий a
, то они будут объединены, как ba
при том же последнем индексе.
$array = array('a', 'b', 'a', 'b', 'a', 'a', 'a');
$result = array_reduce($array, function($acc, $item){
// if has one item and last item is 'b' and current item is 'a'
if(count($acc) > 0 amp;amp; $acc[count($acc)-1] == "b" amp;amp; $item=="a"){
// make last item as 'ba'
$acc[count($acc)-1] = "ba";
return $acc;
}
array_push($acc, $item);
return $acc;
}, array());
print_r($result); // Array ( [0] => a [1] => ba [2] => ba [3] => a [4] => a )
Ответ №2:
Я действительно не понимаю причины вашей логики, однако, я думаю, приведенный ниже код делает то, о чем вы говорите. По крайней мере, это соответствует вашим ожидаемым результатам.
Если ваши примерные данные a
и b
не являются репрезентативными для ваших фактических данных, например, это текст произвольной формы произвольной длины, это определенно нарушит.
Смотрите комментарии к коду, чтобы узнать, как это работает.
$result = [];
// The first two need to be setup manually. There should probably be a guard around this
// with a length check for $test.
$result[] = array_shift($test);
$result[] = array_shift($test);
// Inside the loop we'll keep removing items
while(count($test)){
// Setup common variables
$current = array_shift($test);
$last = end($result);
$last_char = $last[-1];
if(strlen($last) >= 2){
// If we have two (or more) characters at the end of the array, just append
$result[] = $current;
}elseif($current === $last_char){
// Also, if we have the same character as last time, just append
$result[] = $current;
}else{
// Otherwise we have a different character, so append the current to the previus
$result[ count($result) - 1 ] = $last_char . $current;
}
}
var_dump($result);
И вот онлайн-демонстрация: https://3v4l.org/0CS8m