![](/img/trans.png)
[英]What's the best way to implement typo correction into a search in php/mysql?
[英]What's the best way to implement user's preferences in this PHP app?
我有一個較小的網絡應用,可將內容從一種社交資源重新發布到另一種社交資源。 假設用戶有5種過濾內容的選項。 它們的首選項以1或0標記的形式存儲在我的用戶數據庫中。
當我每小時執行一次主要的“發布”操作時,分解代碼以實現這些首選項的最佳方法是什么? 更清楚地說,我當前的實現是這樣的:
mysql_query(SELECT * FROM users);
foreach ($user as $row){
get_json_data($userID);
if ($pref1 == 1){
/code that enacts preference 1, adds results to array $filtereddata
}
if ($pre2 == 1 ){
/code that filters out preference 2, adds results to $filtereddata
{
postfinalarray($filtereddata);
}
顯然,這是模擬代碼,但這是我一直在使用的一般流程。 有沒有更好的方法來實現根據用戶的喜好定制功能? 我是否應該設計函數接受這些首選項作為參數? 這會節省處理時間還是更易於維護?
抱歉,這太籠統了,請提出問題,以便我澄清。
當然,有很多可能性可以改進這種代碼。 試想一下,如果您要添加其他首選項,則必須重寫整個代碼。 我總是嘗試使用面向對象的方式,因此創建用戶類總是有意義的:
<?php
class User
{
private $_data;
public function __construct($userdata, $preferences)
{
$this->_data = $userdata;
}
public function getPreferencesData($preferences)
{
$result = array();
$prefs = $this->_data['preferences'];
foreach($preferences as $key => $value)
{
if($value == "1")
$result[] = $this->_data[$key];
}
return $result;
}
}
$mypreferences = array("name" => 1, "birthdate" => 0); // show e.g. name and birthdate
$mydata = array("name" => "Gaius Julius Caesar", "birthdate" => "July 13th -100");
$testuser = new User($mydata);
print_r($test->getPreferencesData($mypreferences));
?>
然后,您可以輕松地適應用戶選擇的偏好,而不必更改代碼。
根據您提供的有限信息,您的方法似乎不錯。
我可能會做些不同的事情。 我將有一張您的5個首選項的表(或者如果它們不太可能更改,則只需對其進行硬編碼)。 我將創建一個鏈接首選項和用戶的交叉引用表。 然后,您可以執行以下操作:
foreach($users as $user)
{
$filtereddata = array();
foreach($user->getPreferences() as $pref)
{
$filtereddata += $this->getFilteredData($user, $pref);
}
}
這比您正在使用的開銷更大,但是如果/當您添加首選項/功能時,則更容易擴展。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.