在 foreach 循环中将一个值与前一个值进行比较并删除相同的值?

问题描述 投票:0回答:4

在 foreach 语句中, 删除重复值?我不知道如何问这个问题?

这是我的代码

$text = "ABC01
ABC02
ABC03
ABC04
ABC05
ABC06
";
$text = explode("\n",str_replace("\r", "", $text));
$text = array_filter($text, 'trim');
$previous = "";

foreach ($text as $line) {

    if ($line == 'ABC04') {
        echo $previous." - ".$line;
        echo '<br>';
    }
    else{
        echo $line;echo '<br>';
    }

$previous = $line;
}

结果是

ABC01
ABC02
ABC03
ABC03 - ABC04
ABC05
ABC06

但是 ABC03 在第三行

我想要这个结果

ABC01
ABC02
ABC03 - ABC04
ABC05
ABC06
php
4个回答
1
投票

也许这是一个解决方案?
我使用 array_search 来查找值键。
我将该值添加到之前的值中。
然后我取消设置找到的键并爆炸数组。

$text = "ABC01
ABC02
ABC03
ABC04
ABC05
ABC06";
$text = explode("\n",str_replace("\r", "", $text));
$text = array_filter($text, 'trim');

$key = array_search("ABC04", $text);

$text[$key-1] .= " - " . $text[$key];
Unset($text[$key]);

Echo implode("<br>\n", $text);

https://3v4l.org/WrTCZ

编辑;我发现缩进代码在 3v4l 中引起了问题。 将链接替换为不缩进


0
投票

这个也有效。很简单

foreach ($text as $line) {

    if ($line == 'ABC03') {
        echo $line.' - ';
    } else {
        echo $line.'<br>';
    }

}

0
投票

这是一个有效的 foreach。但我不清楚你到底想做什么。

foreach ($text as $line) {

    if ($line == 'ABC03') {
        echo $line.' - ';
    }
    else{
        echo $line;
        echo '<br>';
    }

   if ($line != 'ABC04')
       $previous = $line;
   }
}

0
投票

对我来说,当他搜索的值没有前一个元素时,遇到了一个明显的问题——因此不需要使用连字符连接。

因为此任务只需要文本中的一行将其前面的换行符替换为空格-连字符-空格,所以这个 XY Problem 最直接地通过单独的

preg_replace()
调用来解决。抛弃所有其他笨拙的处理和循环。

  • .+
    将匹配一个或多个非换行符
  • \K
    将重新开始全字符串匹配
  • \R+
    将匹配一个或多个换行符序列。
  • (?=...)
    是前瞻——确保找到所寻找的文字字符

代码:(演示

echo preg_replace(
         '/.+\K\R+(?=ABC04)/',
         ' - ',
         trim($text)
     );
© www.soinside.com 2019 - 2024. All rights reserved.