Изменение текста в зависимости от округленной суммы из базы данных - PullRequest
2 голосов
/ 11 апреля 2010

На веб-сайте у меня есть несколько небольших PHP-скриптов для автоматизации изменений в тексте сайта, в зависимости от цифры, которая рассчитывается из базы данных MySQL. Сайт предназначен для группы по сбору средств, а в тексте на главной странице указана общая привлеченная сумма.

Собранная сумма извлекается из базы данных и округляется до тысяч. Это PHP, который я использую для округления фигуры и нахождения последних трех цифр от общего числа:

$ query4 = mysql_query ("ВЫБЕРИТЕ СУММУ (сумма собрана) КАК full_total ОТ сбора средств;");
$ result4 = mysql_fetch_array ($ query4);
$ fulltotal = $ result4 ["full_total"];
$ num = $ fulltotal + 30000;
$ ftotalr = round ($ num, -3);
$ roundnum = round ($ num);
$ string = $ roundnum;
$ length = strlen ($ string);
$ символов = 3;
$ start = $ length - $ символов;
$ string = substr ($ string, $ start, $ символов);
$ figure = $ string;

(£ 30 000 - это сумма, которая была собрана предыдущей командой по сбору средств с момента первого запуска проекта, поэтому я добавил 30000 к полной сумме $ для переменной $ num)

В настоящее время текст гласит:
the bookstall and other fundraising events have raised more than &pound;<? echo number_format($ftotalr); ?>

Я только что понял, что, поскольку PHP округляется до ближайшей тысячи, если общая сумма составляет, например, 39 200 фунтов стерлингов и округляется до 40 000 фунтов стерлингов, сказать, что это более 40 000 фунтов стерлингов, неверно, и в этом случае я ' мне нужно было сказать «почти 40000 фунтов стерлингов» или что-то подобное. Очевидно, мне нужно заменить «больше, чем» на переменную.

Очевидно, мне нужно проверить, являются ли последние три цифры суммы ближе к 0 или 1000, чтобы, если сумма составляла, например, 39,2000 фунтов стерлингов, текст читался бы как «чуть больше», если бы он был между £ От 39 250 до 39 400 фунтов стерлингов, что-то вроде «больше», от 39 400 до 39 700 фунтов стерлингов, что-то вроде «хорошо закончено», и от 39 700 до 39 999 фунтов стерлингов, «почти».

Мне удалось получить последние три цифры суммы как переменную, и я думаю, что мне нужен какой-то блок кода if / else / elseif (не уверен, что это будет правильный подход, или стоит ли use case / break), и, очевидно, мне придется проверить, соответствует ли фигура каждому из критериев, но я не могу понять, как это сделать. Кто-нибудь может предложить, как лучше всего это сделать, пожалуйста?

Ответы [ 4 ]

1 голос
/ 11 апреля 2010

Самым простым и изящным решением imho, как указала Лизард, было обоснование ценности и всегда говорить «за». Вы могли бы даже сделать исключение для задачи «первая 1000» и опустить что-нибудь ниже этого уровня до следующих 100 или около того, что-то вроде ...

<?
function getFlooredText($amount) {
    if($amount < 1000) {
        return floor($amount/100)*100;
    } else {
        return floor($amount/1000)*1000;
    }
}

echo "We've raised over &pound;" . getFlooredText(455) . "\n"; // 400
echo "We've raised over &pound;" . getFlooredText(1455) . "\n"; // 1000
echo "We've raised over &pound;" . getFlooredText(38800) . "\n"; // 38000
?>

Если вы абсолютно не хотите, чтобы вы всегда делали четырех- или пятислойный сэндвич, это был бы самый простой подход к описанной вами идее, но, возможно, не самый красивый. Как-то так, если бы я понял, куда ты идешь с этим ...

<?
function getRoundedText($amount) {
    $n = substr($amount, -3);
    if($n < 250) {
        return "just over &pound;" . round($amount, -3);
    } elseif($n < 500) {
        return "well over &pound;" . round($amount, -3);
    } elseif($n < 750) {
        return "close to &pound;" . round($amount, -3);
    } elseif($n < 1000) {
        return "almost &pound;" . round($amount, -3);
    }
}

echo "We've raised " . getRoundedText(38200) . "\n";
echo "We've raised " . getRoundedText(38400) . "\n";
echo "We've raised " . getRoundedText(38700) . "\n";
echo "We've raised " . getRoundedText(38900) . "\n";
?>

Надеюсь, это поможет.

1 голос
/ 11 апреля 2010

Вместо вложенных блоков if else у вас может быть функция, которая принимает сумму в долларах, и внутри функции выдает переменную в операторе switch case и в конкретном случае возвращает правильный echo 'd текст.

Случаи переключения обеспечивают читаемость нескольких операторов if else. Если вам нужны примеры кодов, дайте мне знать.

Обновление:

Сравнение только на целых числах, switch case - лучшая ставка. При сравнении условий, которые приводят к логическому значению, вам нужно использовать if else.

Я взял ваш код и переключил case на if else, и вот как это выглядит с примером вывода:

function qualifier($figure) {
        if ($figure < 249) return "just over";
        elseif ($figure < 399) return "over";
        elseif ($figure < 699) return "well over";
        elseif ($figure < 999) return "almost"; 
        else return "No number entered";
     }

echo "We are " . qualifier(250) . " our goal!";
// outputs: "We are over our goal!"
0 голосов
/ 11 апреля 2010

Я бы использовал «приблизительно», чтобы охватить все случаи!

0 голосов
/ 11 апреля 2010

Возможно, вам не нужно менять текст ... взгляните на функцию floor http://php.net/manual/en/function.floor.php

Он всегда будет округляться, поэтому вы все равно можете сказать «больше, чем».

...