PHP взорваться, сохранить «остатки»

0

В этом сценарии все работает так, как ожидалось:

$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

2 ответа

3
Лучший ответ

Функция 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
  • 0
    Спасибо. Я думал, что предел оставит все остальное без внимания, но, похоже, это не так. Это именно то, что я искал.
1

В вашем конкретном случае вы можете использовать предельное предложение функции 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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню