用PHP,list()函数能否将值添加到数组中?

4

我有一个foreach循环正在迭代。我尝试将一个变量"exploded"(分解)成多个部分,然后使用list()函数将它们附加到相应的数组中,就像这样:

list($a[], $b[], $c[]) = explode(':', $loop);

list()不能做到这一点吗?它会出现以下错误:

致命错误:字符串不支持[]运算符

我想我可以在list()中使用临时变量,然后在之后将它们附加到相应的数组上,就像这样:

foreach($array as $loop) {
    list($a1, $b2, $c3) = explode(':', $loop);

    $a[] = $a1;
    $b[] = $b2;
    $c[] = $c3;
}

有没有更好/更高效的方法来做这件事(比如完全使用list())?


如果我将$a,$b,$c初始化为数组,第一行代码对我来说实际上是有效的。我可以使用[]list()直接赋值给数组元素。在你的代码中$array里面是什么? - Michael Berkowski
啊,好的。我没意识到,在 list() 中我只是初次初始化了 $a,$b,$c。(只是做个参考,这是编程中的不良实践吗?)。$array 是一个包含10-20个字符串的数组(字符串是url的后半部分,例如 '/questions/12886947/')。 - Coldblackice
2
@Coldblackice:对我来说可以运行:http://codepad.org/SsaYK0OP - 你的问题在于你没有先初始化变量,你重复使用了其中一个变量,这就是为什么你看到错误消息的原因。 - hakre
2个回答

2

list结构需要一个有效的变量表达式,类似于数组和索引:

foreach ($array as $i => $loop) {
    list($a[$i], $b[$i], $c[$i]) = explode(':', $loop);
}

一切顺利。 演示

如果实际上是数组,也可以正常工作:

$a = $b = $c = array();

foreach ($array as $loop) {
    list($a[], $b[], $c[]) = explode(':', $loop);
}

Demo


这段程序与我的电脑上的初始化很匹配(哦,抱歉,你刚刚添加了那个...) - Michael Berkowski
如果您添加索引@Michael Berkowski,他们就不必这样做。 - Baba
@MichaelBerkowski:如果它们未设置,您甚至可以跳过初始化。 OP的问题是其中一个被重复使用了。请参见http://codepad.org/SsaYK0OP - hakre
有没有一种方式比另一种更“专业”?也就是说,预先初始化某些内容是否更好的编程习惯/礼仪?我在想,首先在list()内部初始化某些内容是否有点懒。 - Coldblackice
1
@Coldblackice:嗯,在你的情况下,无论是否懒惰,你都犯了一个错误。如果你的编码规则有助于改善代码,初始化可能会防止这种情况。但是,我认为更重要的是正确理解错误消息,因为这将帮助你更多。PHP假定子字符串访问,所以你可以看到其中一个“我希望它们是数组”的变量实际上是字符串。这在变量重用时很容易发生。不要在此处重用变量是更专业的做法。 - hakre
@hakre,今天见到你真好... :) +1 - Baba

1

可以的..只需添加Index而不初始化变量

list($a[0], $b[0], $c[0]) = explode(":","A:B:C") ;
var_dump($a,$b,$c);

或初始化变量

$a = $b = $c = array();
list($a[], $b[], $c[]) = explode(":","A:B:C") ;
var_dump($a,$b,$c);

输出

array
  0 => string 'A' (length=1)
array
  0 => string 'B' (length=1)
array
  0 => string 'C' (length=1)

所以,在你的第二个例子(初始化变量)中,是否需要在list()中的每个变量后面添加[]?还是PHP会自动将它们附加到数组上? - Coldblackice
@Coldblackice。。。抱歉我错过了那个 - Baba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接