2012-02-23 4 views
1

Это должно быть каким-то образом, но я просто не вижу его. Я извлек его из своего приложения и протестировал его в отдельном скрипте, и он работает точно так же. Вот извлеченный код, но он имеет ту же проблему независимо.Список PHP получен? Первый var возвращает первый символ второго 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', но это не так!

+1

Отредактировал ваш вопрос, так как я предполагаю, что вы имели в виду, что вы ожидаете, что третий элемент вернется '14'. – Matthew

+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); 
+2

Или 'list ($ id, $ url) = explode ('-', $ actions [1], 2);' – Matthew

1

Что случилось переменная $url изменяется и перезаписаны со вторым элементом предыдущего массива $url перед тем $id назначен. Это связано с тем, что list() загружает переменные справа налево, а не слева направо.

При доступе к $url[0], когда он был преобразован в строку в list() вызова, вы получите первый символ, p, и это то, что становится хранится в $id.

См. notes on the list() docs для информации о заданиях справа налево ...

1

list перезаписывает переменную $url перед созданием $id.

Из инструкции:

Модификация массива во время выполнения списка() (например, с использованием списка ($ а, $ б) = $ б) приводит к неопределенному поведению.

Используя другую переменную на левой стороне решает эту проблему:

list($id, $urx) = $url; 
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 
?> 
0

Проблема заключается в заявлении

list($id, $url) = $url; 

изменяемого массива в то время как вы его обработать.

Смежные вопросы