PHP列表问题?第一个var返回第二个var的第一个字符

时间:2012-02-23 22:35:13

标签: php arrays list

这一定是某种陷阱,但我看不到它。我把它从我的应用程序中取出并在一个单独的脚本中测试它,它以相同的方式执行。这是提取的代码,但它独立地存在相同的问题。

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

  5. 我期待3回复string '14',但事实并非如此!

5 个答案:

答案 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;

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