微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

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

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

$My_Array = [

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

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

,其中一个字符串开始的字符已经存在于前一个字符串的结尾

我的目标是返回以下数组:

$My_Processed_Array = [

  'The quick brown fox',];

目前完成的工作:

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

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() 按空格分割每个字符串。
  • 将它与之前分解的字符串一一比较。
  • 创建一个新的比较指针。
  • 如果当前词的当前指针与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);
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。