|
|
|
|
<?php
$map[] = "111";
$map[] = "222";
while ($item = current($map)) {
$map1[] = rand(0, 150);
$map=array_merge($map1, $map);
$item = next($map);
echo "<h1>{$item}</h1>";
print_r($map);
++$i;
if($i>5){
break;
}
}
?>
|
на выходе имеем
111
Array ( [0] => 74 [1] => 111 [2] => 222 )
86
Array ( [0] => 74 [1] => 86 [2] => 74 [3] => 111 [4] => 222 )
86
Array ( [0] => 74 [1] => 86 [2] => 4 [3] => 74 [4] => 86 [5] => 74 [6] => 111 [7] => 222 )
86
Array ( [0] => 74 [1] => 86 [2] => 4 [3] => 75 [4] => 74 [5] => 86 [6] => 4 [7] => 74 [8] => 86 [9] => 74 [10] => 111 [11] => 222 )
86
Array ( [0] => 74 [1] => 86 [2] => 4 [3] => 75 [4] => 93 [5] => 74 [6] => 86 [7] => 4 [8] => 75 [9] => 74 [10] => 86 [11] => 4 [12] => 74 [13] => 86 [14] => 74 [15] => 111 [16] => 222 )
86
Array ( [0] => 74 [1] => 86 [2] => 4 [3] => 75 [4] => 93 [5] => 142 [6] => 74 [7] => 86 [8] => 4 [9] => 75 [10] => 93 [11] => 74 [12] => 86 [13] => 4 [14] => 75 [15] => 74 [16] => 86 [17] => 4 [18] => 74 [19] => 86 [20] => 74 [21] => 111 [22] => 222 )
|
такое ощущение что next() перестает работать | |
|
|
|
|
|
|
|
для: V2D
(13.09.2010 в 10:55)
| | а с чего он тут должен работать?
$map1[] = rand(0, 150);
$map=array_merge($map1, $map);
не совсем понятно почему ты не используешь просто $map[] = rand(0,150)
в общем я тут не совсем понимаю твою логику действий
$map[] = "111";
$map[] = "222";
while ($item = current($map)) {
$map[] = rand(0, 150);
//$map=array_merge($map1, $map);
$item = next($map);
echo "<h1>{$item}</h1>";
print_r($map);
++$i;
if($i>5){
break;
}
}
|
| |
|
|
|
|
|
|
|
для: Kioshy
(13.09.2010 в 11:16)
| | Я сократил по минимум код для примера, использую array_merge потому что я буду подсоединять именно массив, а использовать цикл перебора массива $map1 и добавлять значения по 1 в map - можно, но пока не хочу. Меня интересует почему цикл зацикливается на втором значении и не идет дальше... | |
|
|
|
|
|
|
|
для: V2D
(13.09.2010 в 14:03)
| | А если по иному - вы чего хотите сделать? | |
|
|
|
|
|
|
|
для: sim5
(13.09.2010 в 14:08)
| | Да сделать не проблема. Мне интересно почему конкретный код глючит. Это моя ошибка или ошибка php, вот в чем вопрос :) | |
|
|
|
|
|
|
|
для: V2D
(13.09.2010 в 14:11)
| |
<?
$map[] = "111";
$map[] = "222";
while ($item = current($map)) {
$map1[] = rand(0, 150);
$map=array_merge($map1, $map);
$item = next($map);
echo $item . " - " . current($map) . "<br>"; // все, приехали, поняли почему?
print_r($map);
++$i;
if($i>5){
break;
}
}
?>
111 - 140
111 - 111
Array ( [0] => 140 [1] => 111 [2] => 222 )
|
| |
|
|
|
|
|
|
|
для: sim5
(13.09.2010 в 14:22)
| | Нет не понял. Ваш код тоже зацикливается. | |
|
|
|
|
|
|
|
для: V2D
(13.09.2010 в 14:34)
| | Он никак не может зациклится, и будет всего один проход, так как массив, который вы проходите циклом, модифицируется объденением, после которого первым индексом становится значение добавленного, и после $item = next($map) будет выполнено условие $item = current($map).
Вообще же, код какой-то дикий, непонятный для чего. | |
|
|
|
|
|
|
|
для: sim5
(13.09.2010 в 14:39)
| | всё бы ничего, да только $item = current($map) - условие чисто формально.
На деле это операция присваивания. | |
|
|
|
|
|
|
|
для: Trianon
(13.09.2010 в 14:52)
| | брр эт с какой же стороны current является операцией присваивания?
чуть не упал со стула читая ваш пост =) | |
|
|
|
|
|
|
|
для: Kioshy
(13.09.2010 в 14:55)
| | = операция присваивания.
можете встать. | |
|
|
|
|
|
|
|
для: Trianon
(13.09.2010 в 14:57)
| | наверно я уже слишком стар для такого юмора тока все равно не понял причем тут оператор присваивания и ваш предыдущий пост о $item = current($map) =) | |
|
|
|
|
|
|
|
для: Kioshy
(13.09.2010 в 14:59)
| | операция, а не оператор.
и пост был в адрес sim5 | |
|
|
|
|
|
|
|
для: sim5
(13.09.2010 в 14:39)
| | Если предположить что while заранее просчитывает кол-во элементов массива который ему передали.
То следуя логике в этом коде должно быть минимум 4 прохода. Однако он все-равно зациклится на второй проход и в $item будет передавать 222 пока $i<5.
если же $map=array_merge($map, $map1); заменить на цикл который перебирает массив $map1 и добавляет значения в $map. Тогда все работает нормально. Вот почему так?
<?php
$map[] = "111";
$map[] = "222";
$map[] = "333";
$map[] = "444";
while ($item = current($map)) {
$map1[] = rand(0, 150);
$map=array_merge($map, $map1);
$item = next($map);
echo $item . " - " . current($map) . "<br>"; // все, приехали, поняли почему?
print_r($map);
++$i;
if($i>5){
break;
}
}
?>
|
| |
|
|
|
|
|
|
|
для: V2D
(13.09.2010 в 15:20)
| | Оператор цикла while() ничего заранее не просчитывает.
Он перед каждым очередным проходом вычисляет выражение в скобках. И оценивает его на ложь / истину. И если оценил истиной - выполняет оператор после скобок. | |
|
|
|
|
автор: ..... (13.09.2010 в 15:53) |
|
|
для: V2D
(13.09.2010 в 14:34)
| | Всё логично, просто вы сами наращиваете массив с каждым переходом по нему
<?php
$map = array('111', '222');
$i=0;
if (!is_array($map)) exit('is ne array :)');
do {
$item = current($map);
// курсор как-бы указывает на "адрес элемента массива"
echo '<h3>'. $item .'</h3><pre>';
$map=array_merge(array(rand(0, 150)), $map);
// создание нового (большего размера) массива и вписывание его по адресу первого
if((++$i)>5) break;
print_r($map);
echo "</pre>\n";
}
while (false !== next($map));
# сдвиг курсора на 1+ предидущее положение от начала
|
не перезаписывайте читаемый массив и зацикливания не будет | |
|
|
|
|
|
|
|
для: .....
(13.09.2010 в 15:53)
| | Все, спасибо! Понял теперь, что читаемый массив перезаписывать нельзя. | |
|
|
|