2013-05-02 70 views
2

下面的代碼主要是使用PHP編寫的,但我希望能夠加快這個過程,並且在PHP中解析字符串的速度很慢。使用MySQL改進算法使用MySQL改進算法

假設我從數據庫中獲取一個字符串,並將其轉換爲數組。

$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」 R esult:17


當前方法按預期工作。但是,使用PHP處理這些緩慢。我想過使用JSON,但這意味着我會給用戶提供我的整個價格表,而這並不是我正在尋找的。我也想過使用另一種語言(例如python),但考慮到成本,它並不特別實用。這給我留下了MySQL。

如果有人可以建議以便宜和具有成本效益的方式來做到這一點,請提供例子。更好的是,如果你能提供一個更好的PHP解決方案,這個工作很快。

謝謝!

+0

優化陣列邏輯是硬,讓我們去購物,這個背景嗎?這是magento還是什麼? (另外,'explode()'並給每個部分一個數字值的含義) – Amelia 2013-05-02 03:33:14

+0

對不起。我爲此使用CodeIgniter – 2013-05-02 03:34:30

+0

我認爲您使用的匹配算法在任何語言中效率都不高。它看起來並不像索引,它必須爲每一行計算一個分數。 – Barmar 2013-05-02 03:56:14

回答

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:在PHP
http://addyosmani.com/blog/faster-javascript-memoization/

+0

我實際上沒有控制測試字符串,因爲它們將從原始的'options_list'生成,它由管理員設置。其次,正如我所提到的,我並不是在尋找一個JavaScript解決方案,因爲這意味着最終用戶可以訪問價格表,在這種情況下,這是一個安全漏洞 – 2013-05-02 05:40:28

+0

然後,您需要完成重寫數組搜索和測試速度。 – celeryandsprite 2013-05-03 19:51:50

+0

這正是我在這裏問的 – 2013-05-04 02:55:11