如何在 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_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);
}
我在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_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);
}