如何在 PHP 中连接字符串而不部分重复?

How to concatenate strings without partial duplication in PHP?

我在PHP数组中有一系列的字符串。

每个字符串有时与前一个字符串重叠(一个或多个单词),有时不重叠:

$My_Array = [

  'The quick',
  'quick brown',
  'quick brown fox',
  'jumps over the',
  'over the',
  'lazy dog',
];

我只想合并那些 重叠 的字符串。

ie. 其中一个字符串 start 的字符已经存在于 end 前面的字符串。

我的目标是return以下数组:

$My_Processed_Array = [

  'The quick brown fox',
  'jumps over the',
  'lazy dog',
];

目前完成的工作:

我把它放在一起,在这个实例中有效,但我怀疑它是否能涵盖所有情况:

function process_my_array($array) {
    
  for ($i = (count($array) - 1); $i > 0; $i--) {
  
    // TURN STRING ELEMENTS INTO MINI-ARRAYS
    $Current_Element = explode(' ', trim($array[$i]));
    $Previous_Element = explode(' ', trim($array[($i - 1)]));
    
    $End_Loop = FALSE;
    
    // STRING-MATCHING ROUTINE
    while ($End_Loop === FALSE) {

      if ($Current_Element[0] === $Previous_Element[(count($Previous_Element) - 1)]) {            
        array_shift($Current_Element);
        $array[$i] = implode(' ', $Current_Element);
        $array[($i - 1)] .= ' '.$array[$i];
        unset($array[$i]);
        $array = array_values($array);
        
        $End_Loop = TRUE;
      }
        
      elseif (count($Current_Element) > 1) {
        $Current_Element[0] .= ' '.$Current_Element[1];
        unset($Current_Element[1]);
        $Current_Element = array_values($Current_Element);
      
        if (isset($Previous_Element[(count($Previous_Element) - 2)])) {
          $Previous_Element[(count($Previous_Element) - 2)] .= ' '.$Previous_Element[(count($Previous_Element) - 1)];
          unset($Previous_Element[(count($Previous_Element) - 1)]);
          $Previous_Element = array_values($Previous_Element);
        }
      }
      
      elseif (count($Current_Element) === 1) {
        $End_Loop = TRUE;
      }
    }
  }
    
  return $array;
}

更重要的是,我几乎可以肯定 实现目标结果的方法 比我上面列出的要简单得多。

  • 使用 explode().
  • 按 space 拆分每个字符串
  • 与之前的分解字符串一一比较
  • 创建一个新指针用于比较。
  • 如果当前字的当前指针与prev中的当前字不匹配,则将指针重置为0。否则,继续递增当前指针。
  • 这样,我们就得到了前一个字符串中最长的后缀,它是当前字符串中的前缀。
  • 从当前指针切出分解数组。
  • 要将当前字符串的剩余部分与前一个字符串拼接,请在最后使用 array_mergeimplode 它们。
  • 如果比较后当前指针恰好是0,您可以放心地认为它是一个全新的词。

片段:

<?php

$My_Processed_Array = [];

$prev = [];
$curr = [];
foreach($My_Array as $val){
    $val = explode(" ",$val);
    $ptr = 0;
    foreach($prev as $index => $prev_val){
        if($prev_val == $val[$ptr]){
            $ptr++;
        }else{
            $ptr = 0;
        }
        if($ptr == count($val)){
            if($index == count($prev) - 1) break;
            $ptr = 0;
        }
    }    
    $sliced_data = array_slice($val, $ptr);
    if($ptr == 0 && !empty($curr)){
        $My_Processed_Array[] = implode(" " ,$curr);
        $curr = [];
    }
    $curr = array_merge($curr,$sliced_data);
    $prev = $val;
}

if(!empty($curr)){
    $My_Processed_Array[] = implode(" " ,$curr);
}