代码优化建议

时间:2013-08-11 17:13:42

标签: wordpress function optimization

我希望有人可以在这里查看我的代码并提供任何建议,这样我就可以了解是否有更好的方法来完成同样的任务,因为我自学成才会觉得我缺乏一些最佳实践知识和倾向只是努力工作直到我能做到我想做的事。

无论如何,我正在为wordpress附件模板制作一个功能,该模板将自动检测其图像在wordpress画廊中显示的军事人员的等级。目的是有人可以点击个人图像,它将显示wordpress附件页面,其中包含关于等级的简短说明,然后根据图像标题中列出的军衔将等级徽章放在图像旁边。该功能有效。我只是想改进它,并了解这是否是实现这一目标的最佳方式,或者如果有更好的编码实践,我应该遵循。谢谢你的建议!

    <?php $a = get_the_excerpt(); ?>
<?php
if (substr_count($a, 'Gen') > 0) {
    $rankimage = 'http://myurl.com/images/Gen.png';
    $rank = 'General';
}
elseif (substr_count($a, 'Col') > 0) {
    $rankimage = 'http://myurl.com/images/Col.png';
    $rank = 'Colonel';
}
elseif (substr_count($a, 'LTC') > 0) {
    $rankimage = '';
    $rank = 'Lieutenant Colonel';
}
elseif (substr_count($a, 'Maj') > 0) {
    $rankimage = '';
    $rank = 'Major';
}
elseif (substr_count($a, 'Cpt') > 0) {
    $rankimage = '';
    $rank = 'Captain';
}
elseif (substr_count($a, 'Lt') > 0) {
    $rankimage = '';
    $rank = 'First Lieutenant';
}
elseif (substr_count($a, '2Lt') > 0) {
    $rankimage = '';
    $rank = 'Second Lieutenant';
}
elseif (substr_count($a, 'SMA') > 0) {
    $rankimage = '';
    $rank = 'Sergeant Major of the Army';
}
elseif (substr_count($a, 'CSM') > 0) {
    $rankimage = '';
    $rank = 'Command Sergeant Major';
}
elseif (substr_count($a, 'SM') > 0) {
    $rankimage = '';
    $rank = 'Sergeant Major';
}
elseif (substr_count($a, '1Sgt') > 0) {
    $rankimage = '';
    $rank = 'First Sergeant';
}
elseif (substr_count($a, 'MSgt') > 0) {
    $rankimage = '';
    $rank = 'Master Sergeant';
}
elseif (substr_count($a, 'SFC') > 0) {
    $rankimage = '';
    $rank = 'Sergeant First Class';
}
elseif (substr_count($a, 'SSgt') > 0) {
    $rankimage = '';
    $rank = 'Staff Sergeant';
}
elseif (substr_count($a, 'Sgt') > 0) {
    $rankimage = '';
    $rank = 'Sergeant';
}
elseif (substr_count($a, 'Cpl') > 0) {
    $rankimage = '';
    $rank = 'Corporal';
}
elseif (substr_count($a, 'Spc') > 0) {
    $rankimage = '';
    $rank = 'Specialist';
}
elseif (substr_count($a, 'PFC') > 0) {
    $rankimage = '';
    $rank = 'Private First Class';
}
elseif (substr_count($a, 'Pvt') > 0) {
    $rankimage = 'http://myurl.com/images/01Pvt.png';
    $rank = 'Private';
}
?>
<?php 
if ($rank != null){
    echo "<table border='1' width='100%'>
        <tbody>
        <tr>
        <td style='text-align: center;' colspan='2'>Rank Detected! $a is a $rank! <img src=$rankimage></td></tr>";
//I placed this if here to close the table in the event that the wordpress image had no description containing the closing tags. I nested it inside the if loop so that it doesn't have to run on pages that don't detect a rank in the image caption.
    if (get_the_content() == null){
        echo "</td></tr></tbody></table>";
    }
}
else{

}
?>

我在下面添加了其他代码。

    $date_list = Array(
    Array( 'age', "$birthday", 'now' ),
    Array( 'membership', "$datejoined", 'now' ),
    Array( 'promoted', "$lastpromo", 'now' ),
);

foreach ( $date_list as $date_set ) {
    $var = $date_set[0];
    $start = $date_set[1];
    $end  = $date_set[2];
    $datetime1 = date_create($start);
    $datetime2 = date_create($end);
    $interval = date_diff($datetime1, $datetime2);
    if ( substr_count( $var, 'age' ) > 0 ){
        $age = $interval->format('%y');
    }
    elseif ( substr_count( $var, 'membership' ) > 0 ){
        $years = $interval->format('%y');
        $months = $interval->format('%m');
        $membership = floor(($years*12)+$months);
        if($membership > 1){
            $suffix = 'Months';
        }
        elseif($membership == 1){
            $suffix = 'Month';
        }
        else{
            $membership = "< 1";
            $suffix = 'Month';
        }
    }
    elseif ( substr_count( $var, 'promoted' ) > 0 ){
        $years = $interval->format('%y');
        $months = $interval->format('%m');
        $test = $interval->format('%a');
        $promoted = floor(($years*12)+$months);
        if($promoted > 1){
            $suffix = 'Months ago';
        }
        elseif($promoted == 1){
            $suffix = 'Month ago';
        }
        else{
            $promoted = "< 1";
            $suffix = 'ago';
        }
    }
}

1 个答案:

答案 0 :(得分:1)

当您创建该代码时,您必须进行大量的切割和修复。粘贴,对吧?你有一个if语句有效,然后切断&amp;粘贴它,并改变了文本,并坚持做了19次。男孩那样吮吸,不是吗?

当你一遍又一遍地做同样的事情时,你想要做的是在一个循环中做。在你的情况下,你需要一系列关于每个可能等级的信息,然后你反复进行子检查(这可能不是最好的方法,但我们现在就让它),然后相应地设置你的返回变量。

$a = get_the_excerpt();
$rank_list = Array(
    Array( 'Gen', 'General', 'Gen.png' ),
    Array( 'Col', 'Colonel', 'Col.png' ),
    // And so on...
    Array( 'PFC', 'Private First Class', '' ),
    Array( 'Pvt', 'Private', '01Pvt.png' ),
);

foreach ( $rank_list as $rank_set ) {
    $abbr = $rank_set[0];
    if ( substr_count( $a, $abbr ) > 0 ) {
        $rank = $rank_set[1];
        $img  = $rank_set[2];
        $rankimage = ($img == '') ? '' : "http://myurl.com/images/$img";
        break; // Stop looping through the foreach loop
    }
}

回头查看原始代码。你做了19次不同的事情。您正在进行19次substr_count()检查,将$rank设置为19次,并且您将$rankimage设置为19次。如果你需要添加海军上将会发生什么?您必须再次剪切并粘贴相同的代码块。如果您发现了substr_count()的错误怎么办?您必须更改19行代码,并希望您正确更改所有19行代码。

现在,看看我做了什么作为你的选择。你有一个小代码框架可以完成你需要它做的事情。如果您要将substr_count()更改为preg_match(),则只需更改一行代码而不是19行。如果您必须添加Admiral,则需要向{{{}添加一行代码。 1}}数组,而不是切割&amp;再次粘贴。

编程中有一个基本原则叫做DRY:不要重复自己。当你发现自己切割&amp;一遍又一遍地粘贴(实际上,切割和粘贴)你可能违反了DRY原则。