PHP: наиболее эффективный способ отображения переменной в тексте, когда текст может быть одной из многих возможностей - PullRequest
0 голосов
/ 30 ноября 2011

Ниже приведена ссылка на мой оригинальный вопрос:

PHP: Как отобразить переменную (a) внутри другой переменной (b), когда переменная (b) содержит текст

Хорошо, это еще к проблеме, все ваши предложения работают, но сейчас я ищу наиболее эффективный метод для моей конкретной проблемы.

В моей базе данных есть несколько блоков текста. Когда пользователь (описанный как $teamName) входит на сайт, ему случайным образом присваивается один из этих блоков текста. Каждый блок текста отличается и может иметь разные переменные.

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

Поскольку я предварительно настроил блоки текста, я знаю, что они содержат, поэтому я могу знать, что нужно сделать switch($newsID) и, в зависимости от значения $newsID, я затем запускаю правильные значения, вставленные в функцию sprintf().

Однако существует много блоков текста, поэтому будет много экземпляров case "": и break;. Я хочу, чтобы сайт работал так, чтобы, если на каком-то этапе я изменил блок текста на что-то другое, переменные в sprintf () автоматически обновлялись, а не я вручную обновлял sprintf() в switch() case: .

Извините за длинный пост, надеюсь, это имеет смысл.

EDIT: У меня есть предопределенных блоков текста в моей базе данных в моей таблице teamNews:

Для $newsID = 1:

"$teamName is the name of a recently formed company hoping to take over the lucrative hairdryer design
$sector"

Для $newsID = 2:

"The government is excited about the potential of ".$teamName.", after they made an annoucement that they have hired $HoM"

Для $newsID = 3:

"It is rumored that $teamName are valuing their hairdryer at $salePrice. People are getting excited.

Когда пользователь ($teamName) входит в игру, ему случайным образом присваивается один из этих блоков текста с $newsID из 1,2 или 3. Допустим, пользователю назначен блок текста с $newsID = 2. Так что теперь его имя пользователя ($teamName) вставляется в базу данных в той же строке, что и выбранный текст.

Теперь я хочу отобразить текст, соответствующий этому пользователю, поэтому я делаю следующее:

$news = news ($currentStage,$teamName);

switch ($ID)
{

    case "1":

    sprintf($teamName,$sector)
    echo $news."<br/><hr/>";    

    break;


    case "2":
    sprintf($teamName,$Hom)
    break;

    case "3":
        sprintf($teamName,$saleprice)
    break;

}



$currentStage--;

}

С функцией

function news($period,$teamName)
{


$news = mysql_query("

    SELECT `content`,`newsID` FROM `teamnews` WHERE `period` = '$period' && `teamName` = '$teamName'

    ") or die($news."<br/><br/>".mysql_error());


    $row = mysql_fetch_assoc($news);
    $news = $row['content'];
    $ID = $row ['newsID']; 
    return $news,$ID;

}

Проблема в том, что в действительности существует около 20 различных блоков текста, которые могут быть назначены пользователю. Так что у меня будет много case:. Также, если я хочу изменить все текстовые блоки в базе данных, мне также придется вручную изменить все переменные в sprintf в каждом `` случае: `

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

Так что, если я использую

$replaces = array(
 'teamName' => 'Bob the team',
 'sector' => 'murdering',
 'anotherSector' => 'giving fluffy bunnies to children'
);

возможно ли это сделать:

$replaces = array(
 '$teamName' => '$teamName',
 '$sector' => '$sector',
 '$anotherSector' => '$anothersector'
);

Ответы [ 3 ]

1 голос
/ 30 ноября 2011

Я предлагаю вам установить фиксированный набор именованных заполнителей и использовать методы подстановки str_replace() или eval() (зло).

Таким образом, у вас (например) всегда будет $teamNameи $sector - и вы можете иногда использовать $anotherSector.И у вас есть эти две строки:

1 - $teamName, is the name of a recently formed company hoping to take over the lucrative $sector.
2 - The people at $teamName hate working in $sector, they would much rather work in $anotherSector

Если бы вы сделали:

$replaces = array(
  '$teamName' => 'Bob the team',
  '$sector' => 'murdering',
  '$anotherSector' => 'giving fluffy bunnies to children'
);
$news = str_replace(array_keys($replaces),array_values($replaces),$news);

Вы бы получили

1 - Bob the team, is the name of a recently formed company hoping to take over the lucrative murdering.
2 - The people at Bob the team hate working in murdering, they would much rather work in giving fluffy bunnies to children

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

0 голосов
/ 01 декабря 2011

А как насчет функции eval?
http://php.net/eval

0 голосов
/ 01 декабря 2011

Вы можете создать простой язык шаблонов и хранить шаблоны в своей базе данных.Для этого вы можете использовать strtr.

function replaceTemplateVars($str, $data) {
    // change the key format to correspond to the template replacement format
    $replacepairs = array();
    foreach($data as $key => $value) {
        $replacepairs["{{{$key}}}"] = $value;
    }
    // do the replacement in bulk
    return strtr($str, $replacepairs);
}

// store your teamNews table text in this format
// double curly braces is easier to spot and less ambiguous to parse than `$name`.
$exampletemplate = '{{teamName}} is {{sector}} the {{otherteam}}!!'

// get $values out of your database for the user
$values = array(
    'teamName' => 'Bob the team',
    'sector' => 'murdering',
    'otherteam' => 'fluffy bunnies'
);

echo replaceTemplateVars($exampletemplate, $values);
// this will echo "Bob the team is murdering the fluffy bunnies!!"

Если вам нужны более амбициозные задачи, такие как циклы или фильтры, вы должны найти сторонний язык шаблонов php ииспользуйте это.

...