使用数组和 foreach 循环从另一个字符串中获取一个字符串

Get a String out of another using arrays and foreach loops

我想从另一个地方创建一个字符串:

1- 第一个字符串是:"4-3|5-2|9-6|7-1|2-8"

2- 新字符串必须是:"4, 5, 9, 7, 2"

我有这段代码,但它不起作用:

$string_1 = '4-3|5-2|9-6|7-1|2-8';

$array_1 = explode('|', $string_1);

$string_2 = '';

foreach ( $array_1 as $item ) {

    $array_2 = explode('-', $item);

    foreach ( $array_2 as $item_id => $item_value ) {

        $string_2 .= ($string_2 == '') ? $item_id : ', ' . $item_id;

    }

}

您正在使用 $item_id 但它代表 $array_2 索引。试试这个:

foreach ( $array_1 as $item ) {
    $array_2 = explode('-', $item);
    $string_2 .= ($string_2 == '') ? $array_2[0] : ', ' . $array_2[0];
}

不需要第二个循环,它会为 $array_1 的每一行检查 2 次,因此您将检索所有值而不是第一个。

你所做的几乎是正确的。您只需要在 explode 之后连接 foreach 循环中的字符串。

$array_1 = explode('|', $string_1);

$string_2 = '';


foreach ( $array_1 as $item ) {

    $array_2 = explode('-', $item);

    $string_2.= $array_2[0].' ';

}
echo $string_2;

使用 RegEx 完成这项任务怎么样?

使用正则表达式的代码:

$string_1 = '4-3|5-2|9-6|7-1|2-8';
preg_match_all('/(\d+)-\d+\|?/',$string_1,$matches);
$string_2 = implode(", ", $matches[1]);

Demo

它比遍历字符串的每个字符更有效。


正则表达式解释:

可视化为 RailRoad 图的正则表达式:

  • (\d+):第一个\d匹配一个数字。 + 表示一次或多次。它周围的 () 创建一个组,这意味着匹配项将存储在 $matches 数组
  • -:后跟一个简单的破折号
  • \d+: 然后又出现一个数字一次或多次
  • \|?:还有一个管道符\|(需要转义)。 ? 表示只有一个或没有管道。

preg-match-all 将在给定字符串中搜索所有可能的(重复的)匹配项。