Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Как изменить if на switch


Автор: djundead 23.3.2007, 23:29
Доброго времени суток!
Есть примерно следующая конструкция:
Код

...
        if (in_array("ключ1", $массив1))
        {
            действие;
        }
        if (in_array("ключ2", $массив1))
        {
            действие;
        }
        // редактирование
        if (in_array("ключ3", $массив1))
        {
            действие;
        }
...

Дело в том что ключей около 20 штук и собственно if'ов тоже столько же( попытался перенести это дело на switch, но не смог найти решения при использовании in_array // поиска ключа в массиве.
Покажите в какую сторону двигаться для нахождения решения (если это конечно возможно =) )
Заранее спасибо!

Автор: Serkys 23.3.2007, 23:45
Лучше сделай через foreach().
Код

foreach ($massiv1 as $key => $value) {
  if (in_array($key, $massiv)) {
    действие;
  };
};

Если надо выполнять разные действия, то switch($key) вставляешь внутрь if().
Хотя хотелось бы задачу подробнее.

Автор: Nicholas_S 23.3.2007, 23:46
Опиши задачу подробнее.

Вообще достаточно странно, что данная конструкция работает, если под значением "ключX" понимается именно ключ ассоциативного массива, а не значение, которое требуется найти.

Автор: djundead 24.3.2007, 00:01
массив формируется из запроса к бд с применением explode:
Код

$this->service = explode(",", $this->sql->record['services']);

в итоге ищу по массиву значение:
Код

if (in_array("ключ1", $this->service))
{
// если нашли
   $this->parametr['ключ1'] = 1;
}
if (in_array("ключ2", $this->service))
{
// если нашли
   $this->parametr['ключ2'] = 1;
}
// и так 20 раз
Цитата

Опиши задачу подробнее.

Задача присвоить юзеру определенные метки в зависимости от выбранных им предпочтений
Цитата

если под значением "ключX" понимается именно ключ ассоциативного массива

Нет) Значение, просто немного стормозил =(

И еще вопрос, есть ли смысл переходить на switch? На сколько и главное чем полезнее использовать switch?

Автор: Serkys 24.3.2007, 00:58
Цитата(djundead @  24.3.2007,  00:01 Найти цитируемый пост)
На сколько и главное чем полезнее использовать switch?

Код красивее smile
Мне кажется switch полезен когда выбор идёт опираясь на само значение переменной, без всяких его преобразований.
Можете меня пиннать, но я не вижу ничего некрасивого во ифах. Свич очень узкоспециализированный, чтобы его подстроить под себя почти всегда надо прилагать слишком много усилий.

Автор: szz 24.3.2007, 06:44
Цитата
И еще вопрос, есть ли смысл переходить на switch?

  Нету! Что тебе вообще свитч тут взъелся? Он подходит если ты откровенно сравниваешь переменную с разными значениями. 
  20 раз писать эту хрень тоже нет смысла, когда у тебя очевидно циклично можно пройти. 
разумеется тут нужен foreach, как подсказал Serkys.
   Вот тот же цикл, но с действием. После него результтат абсолютно такой же как и с 20-ю ифами:
Код

foreach ($this->service as $key => $value) {
  if (in_array($key, $this->service)) {
        $this->parametr[$key] = 1; // по-моему очень просто
  };
};


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

  Не, ну это неправда тоже. Довольно часто приходится сравнивать переменную с чем-то. Если сравнений больше двух, то не задумываясь используешь свитч.

Автор: mclight 24.3.2007, 10:15
если уж так хочется поюзать switch,то 
Код

foreach($массив1 as $k=>$v)
    switch($k){
       case 'ключ1':kjsdfhkasjdfhaksdf;break;
       case 'ключ2':kjsdfhkasjdfhaksdf;break;
       case 'ключ3':kjsdfhkasjdfhaksdf;break;
    }

Автор: Serkys 25.3.2007, 00:33
Цитата(szz @  24.3.2007,  06:44 Найти цитируемый пост)
 Не, ну это неправда тоже. Довольно часто приходится сравнивать переменную с чем-то. Если сравнений больше двух, то не задумываясь используешь свитч.

Я к тому, что на практике я очень редко сталкиваюсь с применением свитча. Редко бывает необходимость. Не знаю как у других, но у меня так.

Автор: SelenIT 25.3.2007, 11:36
По-моему, тут вообще можно заюзать http://php.net/array_intersect($массив_для_сравнения, $массив_из_базы) и потом смело фигачить все элементы из результата в эти самые предпочтения многострадального юзера, обойдясь без каких-либо проверок внутри цикла. smile

А вот это
Цитата(djundead @  24.3.2007,  00:01 Найти цитируемый пост)
массив формируется из запроса к бд с применением explode:

имхо, говорит о слегка неправильном проектировании БД (нормализация хромает)...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)