Группировка совпадающих пар в массиве с помощью PHP

#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