重构PHP中的if语句或if语句的其他解决方案(不是switch case)

I have some if statements in my code. e.g:

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 );              
} 

a bit pseudo code of the code above:

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

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

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

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

You see:

00

10

01

11

00

If I insert another variable I'll get a lot of more opportunities and that is realy bad. Because I'll get realy big if statements.

Can somebody tells me another opportunitie to achive the same result?

Thank you.

I'd do it like this:

$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 );

Please try this code :

$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 );   
}     

Create an array($arr) and set the key like "0,0" and value like "$sql"; and your code will be like this:

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

So when you want to add more pages and posts all you will do is to change the 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 );