Почему это изменение в порядке присваивания меняет содержимое переменных? - PullRequest
0 голосов
/ 24 января 2011

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

Если я бегу

$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

SMACKS HEAD ... Как я мог пропустить очевидное:) ...

Ответы [ 2 ]

2 голосов
/ 24 января 2011

вы переопределяете

$custId 

, когда пишете эту строку

$custId = $custId[1];

, поэтому после этого вы получаете то, чего не ожидаете

$serial = $custId[2];

это

list($custId,$serial) = array($custId[1],$custId[2]); 
0 голосов
/ 24 января 2011
1.    $custId = $custId[1];
2.    $serial = $custId[2]; // **

** это действительно означает, ($ custId [1]) [2] исходного getExternalId ();

Поскольку переменная $ custId после строки 1 больше не является результатом

$custId = getExternalId();

А точнее только 2-й элемент (индекс [1]) из него.

Вы можете добавить в свою отладку дамп еще раз

$custId = explode('_', $custId);
var_dump($custId);
$custId = $custId[1];
var_dump($custId);
$serial = $custId[2];
...