这一定是某种问题,但我就是看不到。我已经把它从应用程序中取出,并在一个单独的脚本中进行了测试,它的执行方式也是一样的。这是提取的代码,但它单独存在相同的问题。
<?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'
,但它没有!
list
分配其参数,从最后一个开始,到第一个结束。这在手册中有充分的解释,特别是两个警告:
警告
list()
分配从最右边的参数开始的值。如果您使用的是普通变量,则不必担心这一点。但是,如果您使用带索引的数组,您通常期望数组中索引的顺序与您在list()
中从左到右所写的顺序相同;事实并非如此。它是按相反的顺序分配的。警告在
list()
执行期间(例如,使用list($a, $b) = $b
)对数组的修改会导致未定义的行为。
因此,你的表达基本上是这样的:
$url = $url[1]; // $url is now "pictures-of-trees"
$id = $url[0];
访问字符串就像访问字符数组一样,$id
现在是$url
的第一个字符。因此CCD_ 13。
相反,为$url
使用不同的变量名或直接分配它们:
list($id, $url) = explode('-', $actions[1], 2);
在分配$id
之前,变量$url
被修改并被上一个数组$url
的第二个元素覆盖。这是因为list()
从右到左加载变量,而不是从左到右。
当您在list()
调用中将$url[0]
转换为字符串后访问它时,您将获得第一个字符p
,这就是存储在$id
中的字符。
有关从右到左分配的信息,请参阅list()
文档上的注释。。。
list
在创建$id
之前覆盖$url
变量。
来自手册:
在list()执行期间修改数组(例如,使用list($a,$b)=$b)导致未定义的行为。
在左侧使用不同的变量可以解决问题:
list($id, $urx) = $url;
这是因为在list()
构造使用变量$url
时,您正在重新分配该变量。如果您更改变量名,您将得到您期望的结果。请记住,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
?>
问题在于语句
list($id, $url) = $url;
您在处理数组时正在修改它。