Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Баг php или я что-то не понимаю?
 
 автор: V2D   (13.09.2010 в 10:55)   письмо автору
 
 

<?php
$map
[] = "111";
$map[] = "222";


while (
$item current($map)) {
    
$map1[] = rand(0150);
    
$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() перестает работать

  Ответить  
 
 автор: Kioshy   (13.09.2010 в 11:16)   письмо автору
 
   для: 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;
    }
}

  Ответить  
 
 автор: V2D   (13.09.2010 в 14:03)   письмо автору
 
   для: Kioshy   (13.09.2010 в 11:16)
 

Я сократил по минимум код для примера, использую array_merge потому что я буду подсоединять именно массив, а использовать цикл перебора массива $map1 и добавлять значения по 1 в map - можно, но пока не хочу. Меня интересует почему цикл зацикливается на втором значении и не идет дальше...

  Ответить  
 
 автор: sim5   (13.09.2010 в 14:08)   письмо автору
 
   для: V2D   (13.09.2010 в 14:03)
 

А если по иному - вы чего хотите сделать?

  Ответить  
 
 автор: V2D   (13.09.2010 в 14:11)   письмо автору
 
   для: sim5   (13.09.2010 в 14:08)
 

Да сделать не проблема. Мне интересно почему конкретный код глючит. Это моя ошибка или ошибка php, вот в чем вопрос :)

  Ответить  
 
 автор: sim5   (13.09.2010 в 14:22)   письмо автору
 
   для: V2D   (13.09.2010 в 14:11)
 

<?
$map
[] = "111"
$map[] = "222"
while (
$item current($map)) { 
    
$map1[] = rand(0150); 
    
$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 )

  Ответить  
 
 автор: V2D   (13.09.2010 в 14:34)   письмо автору
 
   для: sim5   (13.09.2010 в 14:22)
 

Нет не понял. Ваш код тоже зацикливается.

  Ответить  
 
 автор: sim5   (13.09.2010 в 14:39)   письмо автору
 
   для: V2D   (13.09.2010 в 14:34)
 

Он никак не может зациклится, и будет всего один проход, так как массив, который вы проходите циклом, модифицируется объденением, после которого первым индексом становится значение добавленного, и после $item = next($map) будет выполнено условие $item = current($map).

Вообще же, код какой-то дикий, непонятный для чего.

  Ответить  
 
 автор: Trianon   (13.09.2010 в 14:52)   письмо автору
 
   для: sim5   (13.09.2010 в 14:39)
 

всё бы ничего, да только $item = current($map) - условие чисто формально.
На деле это операция присваивания.

  Ответить  
 
 автор: Kioshy   (13.09.2010 в 14:55)   письмо автору
 
   для: Trianon   (13.09.2010 в 14:52)
 

брр эт с какой же стороны current является операцией присваивания?

чуть не упал со стула читая ваш пост =)

  Ответить  
 
 автор: Trianon   (13.09.2010 в 14:57)   письмо автору
 
   для: Kioshy   (13.09.2010 в 14:55)
 

= операция присваивания.
можете встать.

  Ответить  
 
 автор: Kioshy   (13.09.2010 в 14:59)   письмо автору
 
   для: Trianon   (13.09.2010 в 14:57)
 

наверно я уже слишком стар для такого юмора тока все равно не понял причем тут оператор присваивания и ваш предыдущий пост о $item = current($map) =)

  Ответить  
 
 автор: Trianon   (13.09.2010 в 15:00)   письмо автору
 
   для: Kioshy   (13.09.2010 в 14:59)
 

операция, а не оператор.

и пост был в адрес sim5

  Ответить  
 
 автор: V2D   (13.09.2010 в 15:20)   письмо автору
 
   для: 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(0150);
    
$map=array_merge($map$map1);
    
$item next($map);
    echo 
$item " - " current($map) . "<br>"// все, приехали, поняли почему?
    
print_r($map);
    ++
$i;
    if(
$i>5){
        break;
    }
}
?>

  Ответить  
 
 автор: Trianon   (13.09.2010 в 15:31)   письмо автору
 
   для: 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(0150)), $map);
   
// создание нового (большего размера) массива и вписывание его по адресу первого
    
if((++$i)>5) break;
    
    
print_r($map);
    echo 
"</pre>\n";
}
while (
false !== next($map));
 
# сдвиг курсора на 1+ предидущее положение от начала

не перезаписывайте читаемый массив и зацикливания не будет

  Ответить  
 
 автор: V2D   (14.09.2010 в 07:28)   письмо автору
 
   для: .....   (13.09.2010 в 15:53)
 

Все, спасибо! Понял теперь, что читаемый массив перезаписывать нельзя.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования