PHP Присвоить массив переменным

Я не уверен, что моя память ошибается, но когда я в последний раз использовал PHP (много лет назад), я смутно помню, что делал что-то вроде этого:

$firstVariable, $secondVariable = explode(' ', 'Foo Bar');

Обратите внимание, что приведенный выше синтаксис является неверным, однако в этом примере он присваивает «Foo» переменной $firstVariable, а «Bar» — переменной $secondVariable.

Каков правильный синтаксис для этого?

Спасибо.


person TomBBB    schedule 27.07.2010    source источник


Ответы (3)


list($firstVar, $secondVar) = explode(' ', 'Foo Bar');

list() — это то, что вам нужно.

person Jimithus    schedule 27.07.2010

Сначала несколько примеров только с list(), затем 2 примера с list() в сочетании с Expand().


Примеры на справочной странице PHP для list() особенно показательны:

По сути, ваш список может быть сколь угодно длинным, но это абсолютный список. Другими словами, порядок элементов в массиве, очевидно, имеет значение, и чтобы что-то пропустить, вы должны оставить соответствующие места пустыми в своем списке().

Наконец, вы не можете перечислить строку.

<?php

$info = array('coffee', 'brown', 'caffeine');

// Listing all the variables
list($drink, $color, $power) = $info;
echo "$drink is $color and $power makes it special.\n";

// Listing some of them
list($drink, , $power) = $info;
echo "$drink has $power.\n";

// Or let's skip to only the third one
list( , , $power) = $info;
echo "I need $power!\n";

// list() doesn't work with strings
list($bar) = "abcde";
var_dump($bar); // NULL

?>

Несколько случаев на примере:

Применение list(), explode() и Arrays к дисфункциональным отношениям:

<?php
// What they say.
list($firstVar, $secondVar, , , $thirdVar) = explode(' ', 'I love to hate you');
// What you hear.
// Disaplays: I love you
echo "$firstVar $secondVar $thirdVar";
?>

Наконец, вы можете использовать list() в сочетании с массивами. $VARIABLE[] сохраняет элемент в последний слот в массиве. Следует отметить порядок хранения вещей, поскольку он, вероятно, противоположен тому, что вы ожидаете:

<?php
list(, $Var[], ,$Var[] , $Var[]) = explode(' ', 'I love to hate you');
// Displays: 
// Array ( [0] => you [1] => hate [2] => love )
print_r($Var);
?>

Объяснение того, почему вещи хранятся в порядке, дано в предупреждении на странице руководства list():

list() assigns the values starting with the right-most parameter. If you are 
using plain variables, you don't have to worry about this. But if you are 
using arrays with indices you usually expect the order of the indices in 
the array the same you wrote in the list() from left to right; which it isn't.
It's assigned in the reverse order.
person Peter Ajtai    schedule 27.07.2010
comment
list() больше не назначает переменные в обратном порядке ">php.net/manual/ru/ - person German Khokhlov; 26.04.2018

Начиная с php7.1, вы можете выполнять деструктуризацию симметричного массива.

https://www.php.net/manual/en/migration71.new-features.php#migration71.new-features.symmetric-array-destructuring

Код: (Демо)

$array = [1, 2, 3];
[$a, $b, $c] = $array;
echo "$a $b $c";
// displays: 1 2 3

Без звонка list().

Подробную информацию и примеры можно найти в этом сообщении: https://sebastiandedeyne.com/the-list-function-and-practical-uses-of-array-destructuring-in-php/


Что касается использования explode() с list() или деструктуризации массива, если вам не гарантируется определенное количество элементов, рекомендуется объявить 3-й параметр explode(), чтобы ограничить количество сгенерированных элементов. Это не заставит производить столько элементов; скорее, он просто скажет php прекратить взрыв, когда будет достигнуто это количество элементов.

[$firstVariable, $secondVariable] = explode(' ', $stringToBeHalved, 2);

Если вы не уверены на 100%, что ваши разнесенные данные предоставят сбалансированные данные другой стороне оператора присваивания, вы можете реализовать максимум с помощью описанной выше техники и использовать что-то вроде array_replace(), чтобы обеспечить минимальное количество элементов справа. сторону оператора присваивания.

Код: (Демо)

$strings = [
    "1,2,3,4",
    "1,2,3",
    "1,2"
];

$minElements = 3;
$defElements = array_fill(0, $minElements, null);

foreach ($strings as $string) {
    [$a, $b, $c] = array_replace($defElements, explode(',', $string, $minElements));
    var_export($a);
    echo ' _ ';
    var_export($b);
    echo ' _ ';
    var_export($c);
    echo "\n-----------------\n";
}

Выход:

'1' _ '2' _ '3,4'
-----------------
'1' _ '2' _ '3'
-----------------
'1' _ '2' _ NULL
-----------------

И еще один метод, который очень редко рекомендуется, это вызов extract(). Эта функция может быть опасной, если у вас нет полного контроля над данными, которые она обрабатывает, потому что она поместит все ключи данных в глобальную область видимости в виде имен переменных, что потенциально может перезаписать переменные и привести к уязвимости или поломке скрипта.

Чтобы подготовить данные для извлечения, преобразуйте индексированный массив в ассоциативный массив, назначив ключи.

Код: (Демо)

$threeKeys = ['a', 'b', 'c'];
foreach ($strings as $string) {
    extract(array_combine($threeKeys, explode(',', $string, 3)));
    // now you can use $a, $b, and $c
}

В приведенной выше демонстрации показаны некоторые предупреждения, генерируемые при непредоставлении сбалансированных/ожидаемых объемов данных. Таким образом, мораль этой истории заключается в том, чтобы быть осторожным и устранять возможные побочные случаи, гарантируя, что обработчики данных всегда будут получать то, что им нужно.

person mickmackusa    schedule 27.04.2018
comment
проголосуйте за то, чтобы сообщить нам об этой новой функции в php71 - person Yassine Sedrani; 20.10.2018