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

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

  • VaseninM

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

    Spritz 10 января 2012 г. 20: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 == 'nextday') {
    //var_dump(prev($aTime));
    //var_dump(prev($aTime));
    prev($aTime); // возвращаемся из конца массива в nexday
    prev($aTime); // и next night
    }

    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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