ФорумПрограммированиеPHP для идиотов → Лажаю с массивами и указателями

Лажаю с массивами и указателями

  • VaseninM

    Сообщения: 2417 Репутация: N Группа: Адекваты

    Spritz 10 января 2012 г. 8:59

    Работаю пхп програмистом серверной части реалтайм игры. Даже близко ничего такого не делал, поэтому говнокод изначально. Сейчас лажаю вот в чем.
    Есть массив.
        public $time = array(
    'confirm' => array('id' => 1, 'time' => 30),
    'firstnight' => array('id' => 2, 'time' => 30),
    'day' => array('id' => 3, 'time' => 300),
    'nextnight' => array('id' => 4, 'time' => 30),
    'nextday' => array('id' => 5, 'time' => 300),
    );

    Есть вот такая обработка.
            $aTime = $this->time;
    reset ($aTime);
    while (list($name, $time) = each ($aTime)) {
    $nexttime += $time['time'];
    $currentdo = $time['id'];
    $currentname = $name;
    if ($currenttime <= $nexttime)
    break;
    $i++;

    if ($name == &#39;nextday&#39;) {
    //var_dump(prev($aTime));
    //var_dump(prev($aTime));
    prev($aTime); // возвращаемся из конца массива в nexday
    prev($aTime); // и next night
    }

    }

    Что то у меня два prev не работают. точнее хз. Он делает еще итерацию цикла, но все равно остается на nextday
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 10 января 2012 г. 10:20, спустя 1 час 21 минуту 40 секунд

    я бы не стал мешать в одном блоке each и prev/next
    не всё полезно, что в swap полезло
  • VaseninM

    Сообщения: 2417 Репутация: N Группа: Адекваты

    Spritz 10 января 2012 г. 11:13, спустя 53 минуты 18 секунд

    master, как выйти из этой ситуации? Мне нужно возвращатся на пару шагов назад, если этапы закончились, а время нет?
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 10 января 2012 г. 11:53, спустя 39 минут 5 секунд

    Вся херня из-за того, что each перемещает позицию итератора в массиве, тоесть при выполнении последней итерации у тебя позиция в массиве не последний элемент, а все, конец массива (что-то типа std::vector.end() в сях, по нормальному барьер называется), повидимому в функции prev сначала идёт проверка на валидность позиции курсора, а потом только смещение, если ты заметил в первом var_dump(prev($aTime)); выводится false, что значит, что достигнут конец массива. Заменяешь первый prev на end, у тебя курсор смещается на последний валидный элемент, потом делаешь prev, и все заработает.
    if ($name == &#39;nextday&#39;) {
    // лучше:
    // if (!current($name)) {
    // тогда в конец массива точно попадёшь
       end($aTime); // возвращаемся из конца массива в nexday
       prev($aTime); // и next night
    }
    Но вообще, этож писец какой-то, а не обработка массива ) {+++159+++} по поводу if (!current($name)) { я имелл ввиду, что если у тебя в public $time = array(…); добавится еще элемент в конец, типа &#39;nextweek&#39; => array(&#39;id&#39; => 6, &#39;time&#39; => 100500), то ты со своим if ($name == &#39;nextday&#39;) встрянешь )
    Work, buy, consume, die
  • VaseninM

    Сообщения: 2417 Репутация: N Группа: Адекваты

    Spritz 10 января 2012 г. 11:54, спустя 1 минуту 15 секунд

    Nyaah, ну у меня там поначалу foreach был. А потом стало нужно зациклится и я впал в состояние &quot;че делать то бля?&quot;
    Спасибо, сейчас твой вариант затестю.
  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 10 января 2012 г. 11:58, спустя 4 минуты 5 секунд

    Как что делать, поменять местами id и ключ массива, чтобы был обычный массив а не ассоциативный, for в зубы и все станет намного проще
    Work, buy, consume, die
  • VaseninM

    Сообщения: 2417 Репутация: N Группа: Адекваты

    Spritz 10 января 2012 г. 12:01, спустя 2 минуты 49 секунд

    Nyaah, ну это то да. В коде менять немало придется.
  • VaseninM

    Сообщения: 2417 Репутация: N Группа: Адекваты

    Spritz 10 января 2012 г. 12:15, спустя 14 минут 36 секунд

    Nyaah, спасибо. Работает. {+++117+++} Nyaah,
    по поводу if (!current($name)) { я имелл ввиду, что если у тебя в public $time = array(…); добавится еще элемент в конец, типа &#39;nextweek&#39; => array(&#39;id&#39; => 6, &#39;time&#39; => 100500), то ты со своим if ($name == &#39;nextday&#39;) встрянешь )

    гы. Я прочитал коммент, решил, что !current ненадежен и вернул прямую проверку)))
  • turist_ua

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 10 января 2012 г. 14:16, спустя 2 часа 51 секунду

    может Iterator использовать из SPL ?

Пожалуйста, авторизуйтесь, чтобы написать комментарий!