PHP爆炸,保存";“剩菜”;


PHP explode, save the "leftovers"

在这种情况下,一切都按预期进行:

$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?

PHP explode函数可以接受第三个可选参数$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

在特定情况下,您可以使用explode函数的限制子句。不过,总的来说,尽管我们可以让list()任务发挥作用,但并没有一种干净的方法来捕捉它的"剩余部分"。

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