PHP将数组赋给变量

z2acfund  于 2022-11-28  发布在  PHP
关注(0)|答案(3)|浏览(155)

我不确定是不是我的记忆错了,但是当我上次使用PHP时(几年前),我隐约记得做了这样的事情:

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

请注意,上面的语法不正确,但在本例中,它会将“Foo”赋给$firstVariable,将“Bar”赋给$secondVariable。
正确的语法是什么?

  • 谢谢-谢谢
4xrmg8kj

4xrmg8kj1#

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

list()是你所追求的。

kuuvgm7e

kuuvgm7e2#

首先是几个单独使用list()的示例,然后是两个使用list()和explode()的示例。

PHP manual page for 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.
wrrgggsh

wrrgggsh3#

在php7.1中,您可以执行 * 对称数组解构 *。
https://www.php.net/manual/en/migration71.new-features.php#migration71.new-features.symmetric-array-destructuring
代码:(Demo

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

没有调用list()
这是一种新的现代方法,可以在不声明临时变量的情况下“交换”元素位置。请参见示例herehere以及herehere
对于深入的细分和例子,有一个长看看这个职位:https://sebastiandedeyne.com/the-list-function-and-practical-uses-of-array-destructuring-in-php/
对于将explode()list()或数组解构一起使用,如果不能保证一定数量的元素,最好声明explode()的第三个参数来限制生成的元素数量,这样不会强制生成太多的元素;而是仅仅告诉PHP在达到该数量的元素时停止爆炸。

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

如果您不能100%确保展开的数据将为赋值运算符的另一端提供平衡的数据,则可以使用上述技术实现最大值,并使用类似于array_replace()的方法在赋值运算符的右侧提供最小数量的元素。
代码:(Demo

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

事实上,对称数组解构甚至允许多次访问同一个元素/值--乍一看可能会觉得有点别扭。
例如,您可以将一个单独的值推入两个数组,如下所示:

[0 => $array1[], 0 => $array2[]] = ['zeroIndexedElement'];

如欲了解更多信息,请访问:While destructuring an array, can the same element value be accessed more than once?
还有一种很少建议使用的技术是调用extract()。如果您不能完全控制它所处理的数据,这个函数可能是危险的,因为它会将所有数据的键作为变量名推入全局范围--这可能会覆盖变量并导致脚本漏洞或崩溃。
若要准备要撷取的数据,请指派索引键,将索引数组转换为相关数组。
代码:(Demo

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

上面的演示展示了一些在未提供平衡/预期数据量时生成的警告。因此,这个故事的寓意是要小心,通过确保数据处理者总是收到他们所需要的来消除可能的边缘情况。

相关问题