首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在PHP中连接字符串而不部分复制?

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

Stack Overflow用户
提问于 2021-04-25 17:17:02
回答 1查看 146关注 0票数 1

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

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

代码语言:javascript
复制
$My_Array = [

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

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

ie.,其中一个字符串开头的字符已经存在于前一个字符串的末尾。

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

代码语言:javascript
复制
$My_Processed_Array = [

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

工作到目前为止已完成:

我已经把它放在一起,这在这个例子中是可行的,但我怀疑它是否涵盖了所有的情况:

代码语言:javascript
复制
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;
}

更重要的是,我几乎肯定会有--一种比我上面所做的更简单的方法--来实现目标结果。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-25 18:04:47

使用explode().

  • Compare使用
  • 将每个字符串按空格拆分--它与先前已爆炸的字符串一个接一个地分开。
  • 创建一个新指针以供比较。如果当前单词的当前指针与prev中的当前单词不匹配,则将指针重置为0。否则,继续增加当前的pointer.
  • This方式,我们在前一个字符串中得到了一个最长的后缀,它是当前string.
  • Slice中从当前指针中删除的数组中的一个前缀。
  • 要用前一个指针来缝合当前字符串的剩余,最后使用array_mergeimplode
  • 如果当前指针碰巧是0,那么您可以安全地假设它是一个全新的单词。

片段:

代码语言:javascript
复制
<?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);
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67256190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档