PHP列表明白了吗?第一个var返回第二个var的第一个字符


PHP list gotcha? First var returns first character of second var

这一定是某种问题,但我就是看不到。我已经把它从应用程序中取出,并在一个单独的脚本中进行了测试,它的执行方式也是一样的。这是提取的代码,但它单独存在相同的问题。

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

结果如下:

  1. string '14-pictures-of-trees' (length=20)

  2. array
    0 => string '14' (length=2)
    1 => string 'pictures-of-trees' (length=17)

  3. string 'p' (length=1)

  4. 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;

您在处理数组时正在修改它。