2015-11-22 2 views
1

Пожалуйста, обратите внимание: этот тестPHP массив отливать на Еогеасп не проходит переменную по ссылке

$data=[["id"=>1,"text"=>"One"],["id"=>2,"text"=>"Two"]]; 
foreach((array)$data as &$iter) 
    $iter["append"]=true; 
print_r($data); 

Это выход

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [text] => One 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [text] => Two 
     ) 

) 

Я хочу ITER над массив и добавить еще один ключ внутри ассоциативный массив, поэтому $ iter передается по ref. Я установил бросок внутри «foreach», чтобы быть уверенным, что пустая/нулевая переменная может быть принята без ошибок с помощью инструкции foreach.

Как вы видите на выходе, foreach не добавляет значение, но если я удалю его, он будет работать.

foreach($data as &$iter) 
    $iter["append"]=true; 
print_r($data); 

Это (справа) выход

Array 
(
    [0] => Array 
     (
      [id] => 1 
      [text] => One 
      [append] => 1 
     ) 

    [1] => Array 
     (
      [id] => 2 
      [text] => Two 
      [append] => 1 
     ) 

) 

Я решил литье с отдельной командой вне Еогеаспа, но мой вопрос:

Является ли это ошибка?

Этот тест был запущен на PHP версии 5.6.14 (Apache-2.4 окна-10)

+1

Заданное значение может отличаться от значения, которое находится внутри переменной. Поэтому, если он * будет * работать, он будет неявным назначением: '$ variable = (array) $ variable;'. – Rizier123

+0

Хорошо, но разные значения означают разные ссылки? – Tobia

+1

Для массивов да. –

ответ

0

Кастинг некоторую переменную другого типа (даже тот же) означает, что другая переменная создается.

Так что если у вас есть:

$data = []; // some array here 

Затем делают (array)$data (что то же самое, как array($data) в соответствии с PHP-ручной) означает, что у вас есть новая переменная, так что ваш:

foreach ((array)$data as &$iter) 

работы не с переменной $data, но с некоторой другой переменной, которая по-прежнему имеет те же значения, что и ваш $data.

Таким образом, вы должны явно привести к array:

$data = (array)$data; 
foreach ($data as &$iter) { 
    // do some stuff 
} 

И как руководство сказал:

Присваивание массива всегда включает в себя стоимость копирования.

так что ваши $data и (array)$data не то же самое.

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