2014-04-15 3 views
1

Возможно ли каким-то образом изменить массив, который обрабатывается foreach? Я пробовал этот скриптдинамически изменяющийся массив в foreach

$iterator = 10; 
$cat = array(1 => 'a',2 => 'b',3 => 'c'); 

foreach ($cat as $k => $c) 
{ 
    if ($iterator < 15) 
    { 
     $cat[$iterator] = $iterator; 
     $iterator++; 
    } 
    echo $c; 
} 

но он не меняет массив 'foreached'. Выходной сигнал из Еогеаспа является

аЬса

но var_dump из массива после Еогеаспа является

массива (6) {[1] => строка (1) "а" [2 ] => string (1) "b" [3] => string (1) "c" [10] => int (10) [11] => int (11) [12] => int (12)}

Это означает, что 10, 11, 12 были добавлены в foreach cyclus, но foreach не перебирал их? Можно ли это сделать? Или мне нужно сделать 2foreach cyclus?

ответ

3
<?php 
$iterator = 10; 
$cat = array(1 => 'a',2 => 'b',3 => 'c'); 

foreach ($cat as $k => &$c)//observe the '&' 
{ 
    if ($iterator < 15) 
    { 
     $cat[$iterator] = $iterator; 
     $iterator++; 
    } 
    echo $c; 
} 
?> 
3

Интернет требует больше кошек! передайте массив по ссылке, и вы получите желаемый результат. обратите внимание на &$cat в цикле.

$iterator = 10; 
$cat = array(1 => 'a',2 => 'b',3 => 'c'); 

foreach($cat as $k => &$c) 
{ 
    if ($iterator < 15) 
    { 
     $cat[$iterator] = $iterator; 
     $iterator++; 
    } 
    echo $c; 
} 
+0

Пытался запустить его самостоятельно? http://ideone.com/GATVX4 – zerkms

+0

ha, true Я заметил, что после того, как я нажал сообщение. так стремятся получить очки. – adamS

+1

с поправками. Я согласен с моим предыдущим заявлением о кошках – adamS

3

На самом деле, вы не должны . Потому что foreach будет работать с копией массива. Это означает, что он сначала скопирует ваш массив, а затем прокрутит его. И независимо от того, измените ли вы исходный массив - так как вы работаете с его копией внутри foreach, любая модификация затронет только оригинал массив и не зацикленную копию.

Но - после foreach вы увидите ваши изменения в оригинал массив. Кроме того, мало смысла в этом. Трудно читать и может привести к непредсказуемым результатам.

Одна важная вещь, о которой не упоминалось. Ниже не будет работать:

$iterator = 10; 
$cat = array(1 => 'a');//only one element; same for empty array 

foreach ($cat as $k => &$c) 
{ 
    if ($iterator < 15) 
    { 
     $cat[$iterator] = $iterator; 
     $iterator++; 
    } 
    echo $c; 
} 

-из того, как PHP сделок с указателем массива в foreach.

+1

Я не понимаю, но верхнее решение работает ... поэтому я принял его, я правильно ответил. Во всяком случае, я делаю свое решение с помощью двух foreach, я узнал, что даже в одном foreach я должен проверить и как вы сказали, это делает все трудным для чтения. Спасибо :) –

+0

Да. точка - отсутствие смысла в изменении массива _original_ как есть. Либо работайте со ссылкой или будьте готовы, что изменения будут видны только после цикла –

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