而循环优化一点点

时间:2013-01-17 23:38:46

标签: php loops while-loop micro-optimization

我正在运行while循环,抓取我网站上的所有帖子

while ( $all_query->have_posts() ) : $all_query->the_post();

每个我都需要使用元数据。这是一个名为'rate'的字段,我需要合并类似的值,1-5。

目前,我已经有了这个

while ( $all_query->have_posts() ) : $all_query->the_post();
    $fives = 0;
    $fours = 0;
    $threes = 0;
    $twos = 0;
    $ones = 0;
    if(get_post_meta($post->ID, 'rate', true) == 'five') { 
        $fives = $fives + 5;
    }
    if(get_post_meta($post->ID, 'rate', true) == 'four') { 
        $fours = $fours + 4;
    }
    if(get_post_meta($post->ID, 'rate', true) == 'three') { 
        $threes = $threes + 3;
    }
    if(get_post_meta($post->ID, 'rate', true) == 'two') { 
        $twos = $twos + 2;
    }
    if(get_post_meta($post->ID, 'rate', true) == 'one') { 
        $ones = $ones + 1;
    }
    endwhile;

它有效,但它真的很糟糕。

是否有更优化和干净的方法来做这样的事情?

1 个答案:

答案 0 :(得分:4)

一些数组操作可以大大简化这一点:

$counts = array_fill(1, 5, 0);
$labels = array(1 => 'one', 'two', 'three', 'four', 'five');

while(...) {
    $index = array_search(get_post_meta($post->ID, 'rate', true), $labels);
    $counts[$index] += $index;
}

总计保留在$counts内,$counts[1]为总数。 $labels可以帮助将文本表示与$counts中的数组位置进行匹配 - 这当然可以使用普通switch来完成。

循环使用array_search将文本表示转换为数组索引,然后简单地将相应的计数增加等于索引的数量。

生产代码当然也应考虑array_search返回false的可能性。