PHP. Несколько вариантов в switch case. Какие есть решения?

Пример стандартного кода:
$format = 'png';

SWITCH ($format):
   case 'txt': // условие 1
      break;
   case 'jpg': case 'png': case 'gif':  // условие 2
      break;
   default: // условие по умолчанию
      break;
ENDSWITCH;


Как вы избавляетесь от такой записи: case 'jpg': case 'png': case 'gif':
Раздражает отсутствие вариантов записи case 'jpg', 'png', 'gif': или case ['jpg', 'png', 'gif']:
  • Вопрос задан
  • 17939 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега PHP
♬♬
switch ... case только так записывается.
Можно сделать что-то типа этого:
$format = 'png';

$ext = array(
    'text' => array(
        'txt' => TRUE,
    ),
    'pics' => array(
        'jpg' => TRUE,
        'png' => TRUE,
        'gif' => TRUE,
    ),
    'music' => array(
        'mp3' => TRUE,
        'aiff' => TRUE,
        'wav' => TRUE,
    ),
);

if( isset( $ext['text'][$format])) // сделать что-то для текста
else if( isset( $ext['pics'][$format])) // что-то для картинок
else if( isset( $ext['music'][$format])) // что-то для музыки
else // что-то по умолчанию
;

К тому же, перформанс у if...else, говорят, лучше, чем у switch.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
GHua
@GHua
abstract class AbsctactFileProcessor
{
    abstract public function supports($extension);
    abstract public function process($file);
}

class ProcessingProvider
{
    
    private $processors;

    public function __construct()
    {
        $this->processors = array();
    }

    public function addProcessor(AbsctactFileProcessor $processor)
    {
        $this->processors[] = $processor;

        return $this;
    }

    public function process($file)
    {
        $file = new \SplFileInfo($file);
        $extension = $file->getExtension();
        foreach ($this->processors as $processor) {
            if ($processor->supports($extension)) {

                return $processor->process($file);
            }
        }

        throw new \LogicException();
    }

}

class SimpleTextProcessor extends AbsctactFileProcessor
{

    public function process($file)
    {
        // return ...
    }

    public function supports($extension)
    {
        return in_array($extension, array('txt'));
    }

}

class ImageProcessor extends AbsctactFileProcessor
{

    public function process($file)
    {
        // return ...
    }

    public function supports($extension)
    {
        return in_array($extension, array('png', 'gif', 'bmp', 'jpg'));
    }
}

$provider = new ProcessingProvider();
$provider->addProcessor(new \SimpleTextProcessor());
$provider->addProcessor(new \ImageProcessor());

$provider->process('mybestfile.exe');
Ответ написан
nazarpc
@nazarpc
Open Source enthusiast
Никак, switch имеет именно такой формат записи
Ответ написан
nikel303
@nikel303
Как вариант:
switch(true) {

   case ($format == 'text'):
      break;

   case (in_array($format, array('jpg', 'png', 'gif'))):
      break;

   default:
      break;
}


Но, этот проще воспринимается:
case 'text':
   break;

case 'jpg':
case 'png':
case 'gif':
   break;

default:
   break;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы