Пыха всегда с тобой

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Мы в твиттере!
Мы вконтакте!
Мы на яндексе!

Краснодарское время: 25 Май, 2012, 11:10:53

Страниц: [1]
Печать
Автор Тема: Лажаю с массивами и указателями  (Прочитано 167 раз)
0 Пользователей и 1 Гость смотрят эту тему.
SpartakuS    ↓ 
10 Январь, 2012, 08:59:01
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 32
Сообщений: 2444
Сила слова: 1.31

Работаю пхп програмистом серверной части реалтайм игры. Даже близко ничего такого не делал, поэтому говнокод изначально. Сейчас лажаю вот в чем.
Есть массив.
PHP
    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),
    );
Есть вот такая обработка.
PHP
        $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    ↓ 
10 Январь, 2012, 10:20:41 , спустя 1 час 21 минуту 40 секунд
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

я бы не стал мешать в одном блоке each и prev/next
Записан

SpartakuS    ↓ 
10 Январь, 2012, 11:13:59 , спустя 53 минуты 18 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 32
Сообщений: 2444
Сила слова: 1.31

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


цска ебаное гавно.
Nyaah    ↓ 
10 Январь, 2012, 11:53:04 , спустя 39 минут 5 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Джедаи

Карма: 34
Сообщений: 522
Сила слова: 6.51

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

Work, buy, consume, die
SpartakuS    ↓ 
10 Январь, 2012, 11:54:19 , спустя 1 минуту 15 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 32
Сообщений: 2444
Сила слова: 1.31

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


цска ебаное гавно.
Nyaah    ↓ 
10 Январь, 2012, 11:58:24 , спустя 4 минуты 5 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Джедаи

Карма: 34
Сообщений: 522
Сила слова: 6.51

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

Work, buy, consume, die
SpartakuS    ↓ 
11 Январь, 2012, 12:01:13 , спустя 2 минуты 49 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 32
Сообщений: 2444
Сила слова: 1.31

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


цска ебаное гавно.
SpartakuS    ↓ 
11 Январь, 2012, 12:15:49 , спустя 14 минут 36 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 32
Сообщений: 2444
Сила слова: 1.31

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


цска ебаное гавно.
turist_ua    ↓ 
11 Январь, 2012, 02:16:40 , спустя 2 часа 51 секунду
НЕ ХУЕТА! ХУЕТА!


Карма: 0
Сообщений: 28
Сила слова: 0

может Iterator использовать из SPL ?
Записан
Страниц: [1]
Печать
 

Перейти в: