В этом сценарии все работает так, как ожидалось:
$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?
Функция explode
PHP может принять третий необязательный параметр с именем $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);