2

下面的代码主要是用 PHP 编写的,但我希望能加快进程,而且 PHP 中解析字符串很慢。

假设以下我从数据库中获取一个字符串,并将其转换为一个数组。

$data['options_list'] = array(
            "Colours" => array('red','blue','green','purple'),
            "Length" => array('3','4','5','6'),
            "Voltage" => array('6v','12v','15v'),
        );

这些子数组每个都是一个下拉选择列表,最终用户可以从每个选择列表中准确选择 1。

当用户点击提交时,我希望将提交的值与管理员预定义的“价格表”进行匹配。潜在的“红色”和“6v”将花费 5 美元,但“红色”和“5”(长度)和“6v”将花费 6 美元。

问题是,如何做到这一点?

目前我采取的方法是这样的:

提交表单(3 个选择列表)后,我从数据库中获取管理员设置的相关价格规则。我已经做了一个结果的例子。

$data['price_table'] = 
            array(
                'red;4'=>'2',
                'red;5'=>'3',
                'red;6'=>'4',
                'blue;3'=>'5',
                'blue;4'=>'6',
                'blue;5'=>'7',
                'blue;6'=>'8',
                'green;3'=>'9',
                'green;4'=>'10',
                'green;5'=>'11',
                'green;6'=>'12',
                'purple;3'=>'13',
                'purple;4'=>'14',
                'purple;5'=>'15',
                'purple;6'=>'16',
                'red;3'=>'1',
                'red;3;12v'=>'17',
                'blue;6;15v'=>'18',
        );

注意:上述示例的顺序可以是任意顺序,并且算法应该可以工作。

然后,我将上述每个元素分解为一个数组,并获得与最佳分数匹配的结果。

$option_choices = $this->input->post('select');
$score = 0;
        foreach($data['price_table'] as $key=>$value)
        {
            $temp = 0;
            $keys = explode(';',$key);

            foreach($keys as $k)
            {
                if(in_array($k, $option_choices))
                {
                    $temp++;
                }else{
                    $temp--;
                }               
            }
            if($temp > $score)
            {
                $score = $temp;
                $result = $value;
            }           
        }
        echo "Result : ".$result;

预期结果示例:

选择的选项:“红色”、“5”
结果:3

选择的选项:“3”、“红色” 结果:1

选择的选项:“red”、“3”、“12v” 结果:17


当前方法按预期工作。但是,使用 PHP 处理这些内容很慢。我曾考虑过使用 JSON,但这意味着我将向用户提供我的整个价格表,这并不是我真正想要的。我也考虑过使用另一种语言(例如python),但考虑到成本,这并不特别实用。这给我留下了 MySQL。

如果有人可以建议一种便宜且具有成本效益的方法来做到这一点,请提供示例。如果您可以为此提供一个更快的 PHP 解决方案,那就更好了。

谢谢!

4

1 回答 1

0

看起来您确实努力使结果读取速度更快,但您仍在针对完整列表解析和测试每个数组部分?将搜索转移到 MySQL 并在那里有额外的列可能会运行得更快。

由于您可以控制数组(或测试字符串),也许可以尝试固定长度的字符串:

$results = explode("\n", "
1         Red       v1
22        Blue      v2
333       Green     v3");

$i = 0;
while($i < count($results)) {
    $a = substr($results[$i], 0, 10);
    $b = substr($results[$i], 10, 20);
    $c = substr($results[$i], strpos(' ', strrev($results[$i]))-1);
    if(stripos($userInput, $a . $b . $c) !== false) {
            // parse more...

据说 JavaScript 擅长于使用 memoizaion:
http ://addyosmani.com/blog/faster-javascript-memoization/

于 2013-05-02T05:22:17.893 回答