Почему это изменение в порядке присваивания меняет содержимое переменных?
Объясните пожалуйста:)
Если я бегу
$custId = getExternalId();
echo $custId . "\n"; // Prints foobar_16262499_1
$serial = '';
$custId = explode('_', $custId);
var_dump($custId);
$custId = $custId[1];
$serial = $custId[2];
die("custId: $custId serial: $serial\n");
я получил
custId: 16262499 serial: 2
Это не правильно. Серийный номер должен быть 1. Но если я изменю порядок присвоения на
$custId = getExternalId();
echo $custId . "\n"; // Prints foobar_16262499_1
$serial = '';
$custId = explode('_', $custId);
var_dump($custId);
$serial = $custId[2]; // Change order here!!!
$custId = $custId[1];
die("custId: $custId serial: $serial\n");
Это работает и дает мне
custId: 16262499 serial: 1
ЗАЧЕМ?
В обоих случаях var_dump массива выдает одинаковый вывод:
array(3) {
[0]=>
string(4) "foobar"
[1]=>
string(8) "16262499"
[2]=>
string(1) "1"
}
Я использую PHP/5.3.3 ZendServer
ОШИБКА ГОЛОВА... Как я мог упустить очевидное :)...
2 ответа
Решение
Ты переопределяешь
$custId
когда ты пишешь эту строку
$custId = $custId[1];
так что после этого вы получаете то, чего не ожидаете
$serial = $custId[2];
так вот так
list($custId,$serial) = array($custId[1],$custId[2]);
1. $custId = $custId[1];
2. $serial = $custId[2]; // **
** это действительно означает, ($custId[1])[2] исходного getExternalId();
Поскольку переменная $ custId после строки 1 больше не является результатом
$custId = getExternalId();
А точнее только 2-й элемент (index [1]) из него.
Вы можете добавить к вашей отладке, сбросив еще раз
$custId = explode('_', $custId);
var_dump($custId);
$custId = $custId[1];
var_dump($custId);
$serial = $custId[2];