Почему это изменение в порядке присваивания меняет содержимое переменных?

Объясните пожалуйста:)

Если я бегу

$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];
Другие вопросы по тегам