重构 PHP 中的 if 语句或 if 语句的另一个解决方案(不是 switch case)

Refactor if statements in PHP or another solution for if statements (not switch case)

我的代码中有一些 if 语句。 例如:

if($option[0]->posts == 1 && $option[0]->pages == 1){
    $results = $wpdb->get_results( 'SELECT * FROM '.$wpdb->prefix.'posts WHERE post_status="publish" AND (post_type="page" OR post_type="post") ORDER BY post_title ASC', OBJECT );                          
}

if($option[0]->pages == 1 && $option[0]->posts == 0){
   $results = $wpdb->get_results( 'SELECT * FROM '.$wpdb->prefix.'posts WHERE post_status="publish" AND post_type="page" ORDER BY post_title ASC', OBJECT );
}

if($option[0]->pages == 0 && $option[0]->posts == 1){
   $results = $wpdb->get_results( 'SELECT * FROM '.$wpdb->prefix.'posts WHERE post_status="publish" AND post_type="post" ORDER BY post_title ASC', OBJECT );              
} 

上面代码的一点伪代码:

if foo = 1 and bar = 1 -> return foo and bar

如果 foo = 0 和 bar = 1 -> return 只有 bar

if foo = 1 and bar = 0 -> return 只有 foo

if foo = 0 and bar = 0 -> return false

你看:

00

10

01

11

00

如果我插入另一个变量,我将获得更多机会,这真的很糟糕。因为我会得到非常大的 if 语句。

有人可以告诉我另一个实现相同结果的机会吗?

谢谢。

请试试这个代码:

$sub_query = $operator = '';

if($option[0]->posts == 1)
{
    $sub_query = 'post_type="page"';
    $operator = ' OR';
}
if($option[0]->pages == 1)
{
    $sub_query .= $operator.' post_type="post"';
}

if(empty($sub_query))
{
    return false;
}
else
{
$results = $wpdb->get_results( 'SELECT * FROM '.$wpdb->prefix.'posts WHERE post_status="publish" AND ('.$sub_query.') ORDER BY post_title ASC', OBJECT );   
}     

我会这样做:

$sql_condition = '( 1=2 '; // one fake-condition, just to make it possible to start with 'OR' later

foreach($option[0] as $key => $value) {  // iterate through all possible conditions
    if($value===1) { // maybe exclude $keys that should not be used here
        $sql_condition.=' OR post_type="'.$key.'"';
    }
}
$sql_condition.=')';

$results = $wpdb->get_results( 'SELECT * FROM '.$wpdb->prefix.'posts WHERE post_status="publish" AND '.$sql_condition.' ORDER BY post_title ASC', OBJECT );

创建一个数组($arr) 并设置键如“0,0”和值如“$sql”; 你的代码将是这样的:

$tempKey = $option[0]->pages . "," . $option[0]->posts;
if(isset($arr[$tempKey]) {
     $results = $wpdb->get_results($arr[$tempKey]); 
}

因此,当您想添加更多页面和帖子时,您要做的就是更改 arr。

$types = [];
if ($option[0]->posts)
    $types[] = '"post"';
if ($option[0]->pages)
    $types[] = '"page"';
if (!$types)
    return null;
$results = $wpdb->get_results( 'SELECT * FROM '.$wpdb->prefix.'posts WHERE post_status="publish" AND (post_type IN ('. implode(',', $types) .')) ORDER BY post_title ASC', OBJECT );