提高循环效率

时间:2009-11-19 06:49:32

标签: php mysql performance

我的循环需要帮助。在每个div中,我想显示两组FirstNameLastName而不是一组,但我不知道如何因为循环而这样做。此外,设置不同字体大小的目的是创建一个类似漏斗形状的视觉外观。我的问题是:如何在每个div 中添加另一组名称?是否有更好的方法对此进行编码?如何使我的代码更有效率?

编辑:好吧,我主要是想弄清楚如何在div中添加另一组名称,或者我可以使用另一个循环。当我说在div中添加另一组名称时,我的意思是,我的意思是我想向div添加另一行数据;我希望在一个div中从MySQL获取前两行数据。

$state = 1;
$fontcount = 25;
while ($row = mysql_fetch_assoc($result)) {

    if( $fontcount == 25 ) {                          $fontsize = "250%";
    } elseif( $fontcount < 25 && $fontcount >= 22 ) { $fontsize = "210%";
    } elseif( $fontcount < 22 && $fontcount >= 19 ) { $fontsize = "170%";
    } elseif( $fontcount < 19 && $fontcount >= 16 ) { $fontsize = "150%";
    } elseif( $fontcount < 16 && $fontcount >= 13 ) { $fontsize = "130%";
    } else {                                          $fontsize = "110%";
    }
    if( $state%2 == 0 ) {
            echo "<div style='background-color: #black; font-size: " . $fontsize . "; text-transform:uppercase; text-align:center;'>";
    } else {
            echo "<div style='background-color: #blue; font-size: " . $fontsize . "; text-transform:uppercase; text-align:center;'>";
    }


    echo $row['FirstName'] . " " . ' <span style="font-size: 15px;">$' . $row['LastName'] . "</span>";
    echo "</div>";
    $state++;
    $fontcount--;
}

4 个答案:

答案 0 :(得分:2)

是什么让你认为代码效率不高?您的应用程序中的任何速度问题几乎肯定不是由于在该循环中有if-else梯形图造成的!

话虽如此,我会使用以下内容:

if ($fontcount < 13)      { $fontsize = "110%"; }
else if ($fontcount < 16) { $fontsize = "130%"; }
else if ($fontcount < 19) { $fontsize = "150%"; }
else if ($fontcount < 22) { $fontsize = "170%"; }
else if ($fontcount < 25) { $fontsize = "210%"; }
else {                      $fontsize = "250%"; } 

另一件事: 你有两条线几乎完全相同。将它们改为:

my $color = ( $state%2 == 0 ) ? "black" : "blue";
echo "<div style='background-color: #" . $color . "; font-size: " . $fontsize . "; text-transform:uppercase; text-align:center;'>";

另外,(我不知道PHP,但我猜)你可以在字符串中嵌入这些变量,这样你就不必关闭字符串并一直连接它们:

my $color = ( $state%2 == 0 ) ? "black" : "blue";
echo "<div style='background-color: #$color; font-size: $fontsize; text-transform:uppercase; text-align:center;'>";

答案 1 :(得分:1)

首先,让我回答你的问题......

您想要显示从数据库返回的结果列表。显示字体大小开始,每3个结果的一小部分和每个结果的替代背景颜色......

我的方法是使用您的演示文稿拆分您的数据层,并使用一些计算来减少您的硬编码。


$alt = false;
$dataset = array();
$fontcount = 25.0; // Make this float

while ($row = mysql_fetch_assoc($result)) 
{
    $datarow = array();
    $datarow['FirstName'] = $row['FirstName'];
    $datarow['LastName'] = $row['LastName']
    $datarow['FontSize'] = (int) $fontcount; // Remember to store as Integer not float
    $datarow['BackgroundColor'] = ($alt == true) ? 'black' : 'blue'; // Background color alternation
    $dataset[] = $datarow;

    $alt = ($alt == true) ? false : true; // Alternate
    $fontcount -= 0.334; // reduce float point for 1-third, therefore drop a point every 3 iteration
}

foreach($dataset in $item)
{
    $fontsize = $item['FontSize'].'0%'; // Assuming desire size is 10x of 'fontcount' in percentage
    $output = '';
    $output .= '<div style="background-color:'.$item['BackgroundColor'].'; font-size:'.$fontsize;.'text-transform:uppercase; text-align:center;">';
    $output .= $datarow['FirstName'].'<span style="font-size: 15px;">'.$datarow['LastName'].'</span>';
    $output .= '</div>';
    echo $output;
}

同样作为回复你的评论,你正在寻找代码整洁而不是循环高效。

答案 2 :(得分:1)

如果我正确理解你的问题,你想在每个div中显示两个全名。

要做到这一点,你应该只在记录是奇数时打开div标签,然后在行是偶数时关闭它或者是集合中的最后一条记录。有几种方法可以实现这一目标。我建议你保持一个偶数/奇数计数器,就像你现在用$ state做的那样。打开奇数记录上的div标签;在偶数记录上关闭它。 (如果最终记录是奇数,则在循环后添加一个检查来关闭div。)然后你必须调整你的$ state变量只在记录为奇数时才增加,这样div就会有交替的样式。

正如Tster指出的那样,你的代码在任何严肃的方面都不是非常低效。您可能会挑选一些小问题,但在大多数应用程序中您将看到的唯一真正的效率问题在于嵌套循环。由于你在这里编写输出,我认为你的代码没有深度嵌套,所以我不会出汗。

答案 3 :(得分:1)

首先,在我看来使用嵌套ifs时,如果有超过3个选项,则不应该使用。在这种情况下,我宁愿这样做:

switch (true) {
    case ($fontcount == 25) :
        $fontsize = "250%";
    break;
    case ($fontcount < 25 && $fontcount >= 22) :
        $fontsize = "210%";
    break;
    case ($fontcount < 22 && $fontcount >= 19) : 
        $fontsize = "170%";
    break;
    case ($fontcount < 19 && $fontcount >= 16) :
        $fontsize = "150%";
    break;
    case ($fontcount < 16 && $fontcount >= 13) :
        $fontsize = "130%";
    break;
    default:
        $fontsize = "110%";
    break;
}

在纯PHP文件中使用HTML时,我通常会尝试将其粘贴在变量中,而不是混淆自己。对HTML进行分组或分割使我的眼睛更容易。比如这个:

$div =  "<div style='background-color: " . 
        ($state%2 == 0 ? '#black' : '#blue') . ";" . 
        " font-size: " . $fontsize . ";" . 
        " text-transform:uppercase; text-align:center;'>";


$name = $row['FirstName'] . " " . 
        ' <span style="font-size: 15px;">$' . 
        $row['LastName'] . "</span>";

$div .= $name;
$div .= "</div>";

echo $div;

如果你想要更短的代码,可以获得奖金,是的,我不是说我应该这样做是为了生活

$f=$fontcount;
$c = (($f == 25 ? 25 : ($f < 25 && $f >= 22 ? 21 : ($f < 22 && $f >= 19 ? 17 : ($f < 19 && $f >= 16 ? 15 : ($f < 16 && $f >= 13 ? 13 : 11))))) * 10) . '%';
$fontsize=$c;

获取两行

while ($row = mysql_fetch_assoc($result)) {
$row2 = mysql_fetch_assoc($result);

然后

if ($row2) {
    $name2 = $row2['FirstName'] . " " . 
            ' <span style="font-size: 15px;">$' . 
            $row2['LastName'] . "</span>";
}