这一定是某种陷阱,但我看不到它。我把它从我的应用程序中取出并在一个单独的脚本中测试它,它以相同的方式执行。这是提取的代码,但它独立地存在相同的问题。
<?php
$actions[1] = '14-pictures-of-trees';
var_dump($actions[1]); // 1
$url = explode('-', $actions[1], 2);
var_dump($url); // 2
list($id, $url) = $url;
var_dump($id); // 3
var_dump($url); // 4
结果如下:
string '14-pictures-of-trees' (length=20)
array
0 => string '14' (length=2)
1 => string 'pictures-of-trees' (length=17)
string 'p' (length=1)
string 'pictures-of-trees' (length=17)
我期待3回复string '14'
,但事实并非如此!
答案 0 :(得分:3)
list
从最后一个开始并以第一个结尾分配其参数。这在manual中有详细解释,特别是两个警告:
警告强>
list()
从最右边的参数开始分配值。如果您使用的是纯变量,则不必担心这一点。但是如果你使用带索引的数组,你通常会期望数组中索引的顺序与你在list()
中从左到右的顺序相同;它不是。它以相反的顺序分配。警告强> 在
list()
执行期间修改数组(例如使用list($a, $b) = $b
)会导致未定义的行为。
因此,你的表达基本上是这样的:
$url = $url[1]; // $url is now "pictures-of-trees"
$id = $url[0];
访问字符串就好像是一个字符数组,$id
现在是$url
的第一个字符。因此p
。
相反,为$url
使用不同的变量名称或直接指定它们:
list($id, $url) = explode('-', $actions[1], 2);
答案 1 :(得分:1)
在$url
被分配之前,变量$url
被修改并被前一个数组$id
的第二个元素覆盖。这是因为list()
从右到左加载变量,而不是从左到右。
当您在$url[0]
调用中转换为字符串后访问list()
时,您将获得第一个字符p
,这就是{{1}中存储的字符}}
有关从右到左分配的信息,请参阅notes on the list()
docs
答案 2 :(得分:1)
list
之前, $url
会覆盖$id
变量。
从手册:
在list()执行期间修改数组(例如使用list($ a, $ b)= $ b)导致未定义的行为。
在左侧使用不同的变量可以解决问题:
list($id, $urx) = $url;
答案 3 :(得分:1)
这是因为在$url
构造使用它时,您正在重新分配变量list()
。如果您更改变量名称,您将获得您期望的结果。请注意,list()
以从右到左的方式分配值!
<?php
$actions[1] = '14-pictures-of-trees';
$url = explode('-', $actions[1], 2);
var_dump($url); // 2
list($id, $url2) = $url;
var_dump($id); // 3
var_dump($url2); // 4
?>
答案 4 :(得分:0)
问题在于声明
list($id, $url) = $url;
您正在处理数组时修改数组。