0

所以可以说我有一个这样的字符串。

$pizza = 1,2,3,5-4,7;

我想从中得到的是5-7,但5-7可以是任何组合,比如6-9或10-1,这会发生多次。

$pizza=1-4,2,3-1,5-4,7;

然后我得到了使用帮助

preg_match_all("/(\d\-\d)/", $pizza, $return);

这给了我这个

print_r($return);

Array ( [0] => Array ( [0] => 5-7 ) [1] => Array ( [0] => 5-7 ) )

那么我如何获得该值(5-7)并将其分配给一个变量,例如$slice

4

1 回答 1

2

您应该已经知道preg_match_all的概要。

第三个参数是一个数组,其中包含在您的文本中找到的所有匹配项(第二个参数)。

它是一个包含一组不同数组的数组:第一个包含所有匹配的模式。其他的是子模式的匹配。我不是来写一篇关于正则表达式的文章,那么我会假设你知道它们(刷新:子模式是用括号括起来的那些东西,在你的情况下,它是非常没用的)。

$pizza='1-4,2,3-1,5-4,7';
preg_match_all("/\d\-\d/", $pizza, $return);
var_dump($return);

将产生类似的、不那么令人困惑的结果(正则表达式中没有括号)。

array
  0 => 
    array
      0 => string '1-4' (length=3)
      1 => string '3-1' (length=3)
      2 => string '5-4' (length=3)

如果您发现 print_r 格式更容易:

Array ([0]=>Array([0]=>1-4 [1]=>3-1 [2]=>5-4))

要一次使用一个元素,您可以使用foreach控制结构。

进行练习的代码应与此类似:

foreach ($return[0] as $slice) {
    <do whatever you need with $slice >
}

大括号中的代码将与数组 $return[0](具有匹配切片的数组)中的元素一样多次运行,并且 $slice 将假定不同运行中不同元素的值。

希望这能解决你的疑惑。

说我会使用不同的方法来解决您的任务:

$pizza='1-4,2,3-1,5-4,7';
$return = array_filter(
    explode(',',$pizza), // turn the string into an array
    function($x){return strpos($x,'-');} // filter out the slices without a -
);

foreach ($return as $slice) { // NOTE: no $return[0]
    <do whatever you need with $slice >
}

但这只是个人喜好问题,因为只需操纵这么少的数据量,性能上的差异就可以忽略不计。

于 2012-04-10T23:37:07.627 回答