Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> нужен switch с автоматическим case 
:(
    Опции темы
Dup13x
Дата 1.12.2012, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.5.2010

Репутация: нет
Всего: нет



Ну если правильно выразился, то нужно типа такого

Код

$g = 2;
switch($g)
{
    case $__i++: //0
        echo "uhuhu";
        break;
    case $__i++:
        echo "haha";
        break;
    case $__i++:
        echo "hihi";
        break;
    default:
        echo "def";
}


т.е. вместо $__i у меня поочередно подставятся значения. интересует на сколько это правильно? или как можно сделать более традиционными способами(вручную забивать значения лень, иногда по середине меняется и приходится все значения менять.)
PM MAIL   Вверх
skyboy
Дата 1.12.2012, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



не совсем понятна логика.
можно сделать маппинг:
Код

$mapping = array('func1', 'func2', 'func3');
call_user_func($mapping[$g]);

но лучше уточни условия. пока что не совсем понятно.
PM MAIL   Вверх
Arantir
Дата 2.12.2012, 02:19 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



Dup13x, синтаксически код корректный. PHP позволяет использовать в case переменные и даже функции.

Но способ решения некой , оставшейся неизвестной, задачи довольно странный. Мне кажется, что то, что вам нужно, можно получить и другим более обыденным путем.


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
Dup13x
Дата 3.12.2012, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 27.5.2010

Репутация: нет
Всего: нет



Ну мне нужен тот же switch или что то подобное. Мне не важна нумерация шагов, главное чтобы выполнялись друг за другом, один шаг может выполниться и несколько раз, но за ним идет точно следующий, т.е. скачков нету. Проблема в том, что если вклинивать новые шаги, то приходится менять всю нумерацию шагов, которая в принципе нигде не используется.
PM MAIL   Вверх
ksnk
Дата 3.12.2012, 22:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



Код

function nextstep(&$g,$forward=true){
    $__i=0;
    switch($g)
    {
        case $__i++: //0
            printf("uhuhu - %d ",$__i);
            break;
        case $__i++:
            printf("haha - %d ",$__i);
            break;
        case $__i++:
            printf("hihi - %d ",$__i);
            break;
        case $__i++:
            printf("hihi  - %d ",$__i);
            break;
        case $__i++:
            printf("hihi  - %d ",$__i);
            break;
        case $__i++:
            printf("hihi  - %d ",$__i);
            break;
        default:
            printf("def  - %ds ",'x');
    }
    
    if($forward) $g++;
}

$g=0;
nextstep($g);
nextstep($g);
nextstep($g);
nextstep($g,false);
nextstep($g,false);
nextstep($g,false);
nextstep($g);
nextstep($g);


Цитата

uhuhu - 1 haha - 2 hihi - 3 hihi - 4 hihi - 4 hihi - 4 hihi - 4 hihi - 5

не оно?

Это сообщение отредактировал(а) ksnk - 3.12.2012, 22:43


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
skyboy
Дата 3.12.2012, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



Цитата(Dup13x @  3.12.2012,  20:49 Найти цитируемый пост)
один шаг может выполниться и несколько раз

goto. кошмар отладки.
чуть лучше —  запихнуть switch, какой продемонстрировал ksnk, в объект. с методами "do" — который в зависимости от внутреннего счетчика делает что-то и методами doNext/doSame/stop — которые будут управлять процессом работы, (не)изменяя и запуская ->do снова и снова(так как в switch нет возможности "повторить ветку").
самым корректным, как мне кажется, будет поиск другого архитектурного решения. к примеру, вместо детерминированного конечного автомата(state machine) как сейчас можно использовать список правил с приоритетами… ну, без знания задачи это можно гадать и гадать.
PM MAIL   Вверх
Arantir
Дата 4.12.2012, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 16
Всего: 55



Цитата(Dup13x @  3.12.2012,  20:49 Найти цитируемый пост)
Мне не важна нумерация шагов, главное чтобы выполнялись друг за другом
Так это же стек!

Накатал примерчик smile  smile 
Код

class ExecutableStack
{
    private $data = array();
    private $current = 0;

    public function push($code)
    {
        $this->data[] = create_function('', $code);
    }

    public function do_next($goto_next_step = true)
    {
        if (!this->has_next()) return false;
        $func = $this->data[$this->current];
        $func();
        if ($goto_next_step) $this->current++;
        return true;
    }

    public function has_next()
    {
        return $this->current < count($this->data);
    }
}

$exe = new ExecutableStack();
$exe->push('echo "haha\n";');
$exe->push('echo "hihi\n";');
$exe->push('echo "hoho\n";');
$exe->push('echo "hehe\n";');
$exe->push('echo "huhu\n";');

$exe->do_next(false);
while($exe->has_next())
{
    $exe->do_next();
}

Только для PHP 5.3+

Результат:
Код

haha
haha
hihi
hoho
hehe
huhu

В каком порядке добавляешь, в таком и выполняется. Переход на след. шаг можно подавлять, указывая false в do_next().

Добавлено @ 02:04
Вот так удобнее добавлять функции:
Код

$func = '
for ($i = 0; $i < 10; $i++)
    echo $i;
';
$exe->push($func);


А еще есть сокращенный вызов:
Код

while($exe->do_next()){}


Это сообщение отредактировал(а) Arantir - 4.12.2012, 09:26


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0636 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.