PHP爆炸,保存"剩菜和#34;

时间:2014-11-10 17:25:20

标签: php explode

在这种情况下,一切都按预期工作:

$someString = '1|2|3|4';
list($val1, $val2, $val3, $val4) = explode("|", $someString);

在下面的场景中,$ someString中的值多于将$ vals放入的值:

$someString = '1|2|3|4|5|6';
list($val1, $val2, $val3, $val4) = explode("|", $someString);

我如何才能这样做,以便在第二种情况下$ val4将是4 | 5 | 6而不是4,或者我如何将这些“剩余物”放在$ val4的末尾而不添加$ val5, $ val6等所以它会是456?

2 个答案:

答案 0 :(得分:3)

PHP explode function可以接受名为$limit的第三个可选参数:

  

如果limit设置为正数,则返回的数组将包含最多limit个元素,最后一个元素包含其余string

     

如果limit参数为负数,则返回除最后-limit之外的所有组件。

     

如果limit参数为零,则将其视为1

所以按照这个逻辑,你应该使用explode("|", $someString, 4)

$someString = '1|2|3|4|5|6';
list($val1, $val2, $val3, $val4) = explode("|", $someString, 4);
echo $val1; // 1
echo $val2; // 2
echo $val3; // 3
echo $val4; // 4|5|6

答案 1 :(得分:1)

在您的特定情况下,您可以使用explode函数的限制条款。但总的来说,尽管我们可以让它发挥作用,但没有一种清晰的方式来捕捉list()任务的“剩余”。

The documentation of list()表示返回值是指定的数组。

例如:

$arr = array('a', 'b', 'c', 'd', 'e');
var_dump(list($a, $b, $c) = $arr);
/*
array(5) {
  [0]=>
  string(1) "a"
  [1]=>
  string(1) "b"
  [2]=>
  string(1) "c"
  [3]=>
  string(1) "d"
  [4]=>
  string(1) "e"
}
*/

var_dump($a, $b, $c);
/*
string(1) "a"
string(1) "b"
string(1) "c"
*/

我们可以利用array_slice()利用此功能来提取剩余的同时进行分配:

$leftovers = array_slice( list($a, $b, $c) = $arr, 3);

这与做:

具有相同的效果
$temp = operation_to_build_array();

list($a, $b, $c) = $temp;
$leftovers = array_slice($temp, 3);