0

我正在编写一个系统,该系统通过收集上传到系统的奖杯数据来记录用户在游戏中的成就,它可以正常工作,但我已经开始考虑系统的一部分,我可以用两种不同的方式完成

这部分系统收集奖杯的排名(铜、银、金、水晶、翡翠)和它的价值,每个用户作为游戏表中的记录,除了表的主键和 user_id 外键之外的每个字段表示可以按照它们列出的确切顺序获得的每个奖杯,这意味着它们不会以机器可以轻松搜索的任何方式进行排序

我的战斗方式是有另一个表,其中每条记录都包含游戏和一个字符串,其中列出了由 |'s 分隔的奖杯的排名顺序,所以当我使用 explode(STRING,"|") 时,我得到一个数组和数组的每个索引都是一个字符,它看起来像这样

b|b|s|g|c|g|s|j

这只是奖杯排名,积分值是通过我传递游戏ID和奖杯ID的函数完成的,switch case语句将首先检查我通过了什么游戏,而在每种情况下嵌套的switch case将检查id,在每个在这些情况下,他们返回奖杯的点值

当然我没有计划我的代码,上面的排名字符串最初没有| 而且我没有像那样做点值,因为与排名不同,得分值在 1 到 3 位之间,现在我知道我可以对点值做同样的事情,就像我对排名顺序所做的那样

我想知道哪种方法对 Web 服务器和浏览器更有效,从数据库中提取字符串并使用 explode(STRING,"|") (和 intval() 将点值从字符串转换为整数,需要它们像计算那样)或使用switch case语句调用函数(如查找表)或者如果我已经拥有的足够有效

我对尝试以完全不同的方式做我正在做的事情并不感兴趣,只是为了让它更高效,因为这些方法完全适合我在其中使用它们的嵌套循环

4

2 回答 2

0

我认为最好使用序列化 PHP 函数

public function setValues($values) {
    if (is_array($values)) {
        $this->setFieldValue('values', serialize($values)); // for db field
    } elseif (is_string($values)) {
        $this->setFieldValue('values', serialize(explode(",", $values)));  // for db field
    } else {
        throw new Exception("Invalid values data format");
    }
}

public function getValues() {
    $values = $this->getFieldValue('values'); // or something else getting field data from DB
    if ($values == "") {
        return array();
    } else {
        return unserialize($values);
    }
}

在这种情况下,您可以快速简便地存储和恢复数据。

于 2012-05-14T06:21:08.847 回答
0

尝试重建您的数据库,可能会有一个与用户、奖杯表..列用户 ID、奖杯 ID、总分和/或其他数据有很多关系的表格成就,您可以获得用户名、奖杯类型和积分

于 2012-05-14T06:36:19.710 回答