PHP, foreach, указатель, unset, странное поведение [дубликат]

К сожалению, в текущей итерации flexbox (Уровень 1) нет чистого пути решения проблемы выравнивания последней строки. Это общая проблема.

Было бы полезно иметь свойство flex по строкам:

  • last-row
  • last-column
  • only-child-in-a-row
  • alone-in-a-column

Эта проблема является высокоприоритетной для Flexbox Level 2:

Хотя такого поведения в flexbox трудно достичь, в CSS Grid Layout легко и просто:

В случае, если сетка не является опцией, вот список похожих вопросов, содержащих различные флексографские хаки:

33
задан neworld 3 February 2012 в 12:40
поделиться

2 ответа

Это хорошо документированное поведение PHP. См. предупреждение на странице foreach php.net

Warning

Ссылка на $ value , а последний элемент массива остается даже после цикла foreach . Рекомендуется уничтожить его unset ().

$a = array('a', 'b', 'c', 'd');

foreach ($a as &$v) { }
unset($v);
foreach ($a as $v) { }

print_r($a);

EDIT

Попытайтесь пошаговое руководство к тому, что на самом деле происходит здесь

$a = array('a', 'b', 'c', 'd');
foreach ($a as &$v) { }   // 1st iteration $v is a reference to $a[0] ('a')
foreach ($a as &$v) { }   // 2nd iteration $v is a reference to $a[1] ('b')
foreach ($a as &$v) { }   // 3rd iteration $v is a reference to $a[2] ('c')
foreach ($a as &$v) { }   // 4th iteration $v is a reference to $a[3] ('d')

                          // At the end of the foreach loop,
                          //    $v is still a reference to $a[3] ('d')

foreach ($a as $v) { }    // 1st iteration $v (still a reference to $a[3]) 
                          //    is set to a value of $a[0] ('a').
                          //    Because it is a reference to $a[3], 
                          //    it sets $a[3] to 'a'.
foreach ($a as $v) { }    // 2nd iteration $v (still a reference to $a[3]) 
                          //    is set to a value of $a[1] ('b').
                          //    Because it is a reference to $a[3], 
                          //    it sets $a[3] to 'b'.
foreach ($a as $v) { }    // 3rd iteration $v (still a reference to $a[3]) 
                          //    is set to a value of $a[2] ('c').
                          //    Because it is a reference to $a[3], 
                          //    it sets $a[3] to 'c'.
foreach ($a as $v) { }    // 4th iteration $v (still a reference to $a[3]) 
                          //    is set to a value of $a[3] ('c' since 
                          //       the last iteration).
                          //    Because it is a reference to $a[3], 
                          //    it sets $a[3] to 'c'.
76
ответ дан Mark Baker 24 August 2018 в 19:12
поделиться

Первый цикл foreach не производит никаких изменений в массиве, как и ожидалось. Тем не менее, это заставляет $v присваивать ссылку на каждый из элементов $a, так что к моменту окончания первого цикла $v является, по сути, ссылкой на $a[2].

Как только начинается второй цикл, $v теперь назначается значение каждого элемента. Однако $v уже ссылается на $a[2];, поэтому любое присвоенное ему значение будет автоматически скопировано в последний элемент массива!

Таким образом, во время первой итерации $a[2] будет становятся нулевыми, затем одно, а затем снова, будучи эффективно скопированы на себя. Чтобы решить эту проблему, вы всегда должны отключать переменные, которые вы используете в своих циклах foreach by-reference, или, еще лучше, избегать использования прежнего вообще.

3
ответ дан Adam 24 August 2018 в 19:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: