Как сделать этот PHP, если оператор более простым и коротким?

0

Я чувствую, что следующий код можно сократить, но не знаю, как его переписать :)

$post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';

if( $post_type == 'faq' && !isset( $_REQUEST['mode'] ) )
  $_REQUEST['mode'] = 'excerpt';

// if I just go with else... it doesn't work
elseif( $post_type !== 'faq' && !isset( $_REQUEST['mode'] ) )
  $_REQUEST['mode'] = 'list';

Обновить

Как вы можете видеть !isset( $_REQUEST['mode'] ) используется дважды. $post_type == 'faq' также используется дважды, но в elseif я проверяю отрицательный.

Серьезно, нет способа переписать его одному, if без else...?

Теги:
if-statement

7 ответов

0
Лучший ответ

Как насчет использования тернарного оператора для тестирования "faq"?

$post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';
if (!isset( $_REQUEST['mode'] )) {
    $_REQUEST['mode'] = ($post_type == 'faq') ? 'excerpt' : 'list';
}
  • 0
    Я выбираю ваш ответ, потому что понимаю его больше всего, и он короче моего. И я также могу опустить {}.
0

Попробуй это

$post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';
$_REQUEST['mode'] = !isset($_REQUEST['mode'])?(($post_type==='faq')?'excerpt':'list'):'';
0

Ваш фактический код может быть разрешен для:

if (!isset($_REQUEST['mode'])) {
  if (isset($_GET['post_type'])) {
    $_REQUEST['mode'] = ($_GET['post_type'] == 'faq') ? 'excerpt' : 'list';
  }
}

Но действительно ли это лучше? Я имею в виду, что вы обязательно вернетесь к своему коду некоторое время в будущем...

  • 0
    Я могу оставить комментарий над моим кодом, так что через несколько месяцев я все еще могу это понять :)
0

возможно, использовать более промежуточные переменные, чтобы улучшить читаемость операторов if.

$post_type = isset( $_GET['post_type'] ) ? $_GET['post_type'] : '';
$notRequestMode=!isset( $_REQUEST['mode'] );

if( $post_type == 'faq' &&  $notRequestMode)
  $_REQUEST['mode'] = 'excerpt';

// if I just go with else... it doesn't work
elseif( $post_type !== 'faq' && $notRequestMode)
  $_REQUEST['mode'] = 'list';
0

Так как вам нужен короткий, здесь короткий, основанный на вашем примере кода.

if(!isset( $_REQUEST['mode'] )){
$_REQUEST['mode'] = 'list';
if($_GET['post_type']=="faq")
$_REQUEST['mode'] = 'excerpt';
} 
  • 1
    нужно проверить, установлен ли post_type, хотя
  • 0
    не совсем на его примере
0

Есть хороший шанс, что у вас много $post_type, поэтому я бы сначала установил это в switch:

switch($post_type) {
case 'faq':
  // code here
  break;

case 'somethingElse':
  // code here
  break;

// etc.

Оттуда вы можете даже вставить другой переключатель в $_REQUEST['mode'] если это необходимо, или просто включить ваши операторы if.

В качестве примечания о форматировании, если у меня есть много условий, я положу эти условия на несколько строк:

if (
  $post_type == 'faq' && 
  !isset( $_REQUEST['mode'] ) && 
  // more conditions here
) {
  • 0
    Я просто хотел все больше и больше упростить мой код. Мне не нужно проверять больше $ post_type, только для 'faq'. Извините, если мой вопрос был неясным.
  • 0
    @RafcioKowalsky В этом случае просто используйте один внешний оператор if для вашего $post_type === 'faq' и внутренний оператор if для остальных условий.
Показать ещё 2 комментария
0

В PHP 5. 3+ вы можете использовать сокращенный тройной:

$post_type = $_GET['post_type'] ?: '';
if (!isset( $_REQUEST['mode'] )) {
  $_REQUEST['mode'] = $post_type == 'faq' ? 'excerpt' : 'list';
}

Но самое короткое, вероятно:

if (!isset( $_REQUEST['mode'] )) {
  $_REQUEST['mode'] = isset($_GET['post_type']) && $_GET['post_type'] == 'faq' ? 'excerpt' : 'list';
}

Или на одной линии с укороченной тройкой:

$_REQUEST['mode'] = $_REQUEST['mode'] ?: (isset($_GET['post_type']) && $_GET['post_type'] == 'faq' ? 'excerpt' : 'list');

Ещё вопросы

Сообщество Overcoder
Наверх
Меню