如何解决如何在 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_merge
和implode
。 - 如果经过比较后当前指针恰好是
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 举报,一经查实,本站将立刻删除。