Увеличить эффективность цикла - PullRequest
1 голос
/ 19 ноября 2009

Мне нужна помощь с моей петлей. В каждом div я хочу показать два набора FirstName и LastName вместо одного набора, но я не знаю, как я могу это сделать из-за цикла. Кроме того, цель установки различных размеров шрифта заключается в создании визуального вида, который имеет форму воронки. Мои вопросы: как я могу добавить еще один набор имен в каждый div и есть ли лучший способ закодировать это? Как я могу сделать мой код более эффективным?

Редактировать: Ну, я в основном пытаюсь выяснить, как добавить еще один набор имен в div, или я могу просто использовать другой цикл. Что я имею в виду, когда говорю «добавить еще один набор имен в div», я имею в виду, что хочу добавить еще один ряд данных в div; Я хочу, чтобы первые две строки данных извлекались из MySQL в одной div.

$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 ]

2 голосов
/ 19 ноября 2009

Что заставляет вас думать, что код не эффективен? Любые проблемы со скоростью в вашем приложении почти наверняка не вызваны наличием в этом цикле лестницы 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 голос
/ 19 ноября 2009

Прежде всего, использование вложенных 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;
}

Когда я использую HTML внутри чистого PHP-файла, я обычно пытаюсь вставить его в переменные, чтобы не запутаться. Кроме того, группирование или разделение 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>";
}
1 голос
/ 19 ноября 2009

Если я правильно понимаю ваш вопрос, вы хотите отобразить два полных имени в каждом разделе.

Для этого вам следует открывать тег div только тогда, когда запись нечетная, а затем закрывать его, когда строка четная или является последней записью в наборе. Есть несколько способов добиться этого. Я бы посоветовал вам держать счетчик чётного / нечетного, как и сейчас с $ state. Откройте тег div на нечетной записи; закройте его на четной записи. (Добавьте проверку после цикла, чтобы закрыть div, если конечная запись была нечетной.) Затем вам нужно будет настроить переменную $ state так, чтобы она увеличивалась только тогда, когда запись была нечетной, чтобы div получал чередующийся стиль.

Как указал Тстер, ваш код здесь не очень неэффективен. Вероятно, вы могли бы прикинуть несколько незначительных вещей, но единственная реальная проблема эффективности, которую вы увидите в большинстве приложений, заключается во вложенных циклах. Поскольку вы пишете здесь вывод, я предполагаю, что ваш код не является глубоко вложенным, поэтому я бы не стал его использовать.

1 голос
/ 19 ноября 2009

Во-первых, позвольте мне правильно ответить на ваш вопрос ...

Вы хотите показать список результатов, возвращаемых из базы данных. Отображать размер шрифта, начиная с большого, порцию для меньшего каждые 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;
}

Кроме того, в ответ на ваш комментарий, вы, скорее, ищете правильность кода, а не эффективность цикла здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...