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

Php 使用数组和foreach循环从另一个字符串中获取字符串,php,arrays,foreach,explode,Php,Arrays,Foreach,Explode,我想从另一个字符串中创建一个字符串,其中: 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('-', $

我想从另一个字符串中创建一个字符串,其中:

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\u id
,但它表示
$array\u 2
索引。试试这个:

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

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

您所做的几乎是正确的。分解后,只需将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;
用它来完成这项任务怎么样

使用正则表达式的代码:

$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]);

它比循环遍历字符串中的每个字符要高效得多


正则表达式解释道:

正则表达式可视化为铁路图:

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

然后将搜索给定字符串中所有可能的(重复的)匹配项。

哪种语言?(在我看来像PHP…)当你说“不起作用”时,它做什么?@Almo,是的,肯定是PHP,结果是这样的:在DB中:1-5 | 2-7 | 3-1 | 4-4 | 5 | 6-3 | 7-2 | 8-2 | 9-6 | 13-2结果:1、5、5、5、6、3、7、7、7、7、7、7、1、4、8、2、9,你可以编辑你的结果,它不能帮助人们理解如何解决这类问题,因为正则表达式是不透明的可能包括一个关于正则表达式如何工作的解释。@Almo:刚刚添加:)经过投票,现在回答得很好。:)