2009-06-05 31 views
1

我創建了這個函數,它適用於小字符串,但是對於更長的字符串,它會超時。我正在尋找一種方法來使該功能更快速地工作,而不是超時,或更好的方式來實現我想要的。需要幫助優化php字符串差異函數

function find_diffs($string1, $string2) 
{ 
    $array1 = preg_split("/\b/", $string1); 
    $array2 = preg_split("/\b/", $string2); 
    $array3 = array(); 


    for($i=0, $j=0; $i < count($array1) || $j < count($array2); $i++, $j++) 
    { 
     while(badchars($array1, $i)) 
     { 
      $i++; 
     } 
     while(badchars($array2, $j)) 
     { 
      $j++; 
     } 

     if($array1[$i] != $array2[$j]) 
     { 
      //-------------------------Find Subtractions--------------------// 
      $k = $i; 
      while($array1[$i] != $array2[$j]) 
      { 
       $i++; 
       if($i == count($array1)) 
       { 
        $end = true; 
        break; 
       } 
       while(badchars($array1, $i)) 
       { 
        $i++; 
       } 
      } 
      if($end) 
      { 
       //-------------------------Find Additions--------------------// 
       $end = false; 
       $i = $k; 
       $k = $j; 
       while($array1[$i] != $array2[$j]) 
       { 
        $j++; 
        if($j == count($array2)) 
        { 
         $end = true; 
         break; 
        } 
        while(badchars($array2, $j)) 
        { 
         $j++; 
        } 
       } 
       if($end) 
       { 
        //-------------------------Find Changes--------------------// 
        $end = false; 
        $j = $k; 
        $l = $i; 
        while($array1[$i] != $array2[$j]) 
        { 

         $k = $j; 
         while($array1[$i] != $array2[$j]) 
         { 
          $j++; 
          if($j == count($array2)) 
          { 
           $end = true; 
           break; 
          } 
          while(badchars($array2, $j)) 
          { 
           $j++; 
          } 
         } 

         if($end) 
         { 
          $j = $k; 
          $i++; 
          while(badchars($array1, $i)) 
          { 
           $i++; 
          } 
          while(badchars($array2, $j)) 
          { 
           $j++; 
          } 
         } 
         else 
         { 
          $array3[] = array($l,$i,'-'); 
          $array3[] = array($k,$j,'+'); 
         } 
         if($i == count($array1)) 
         { 
          $end = true; 
          break; 
         } 
         if($j == count($array2)) 
         { 
          $end = true; 
          break; 
         } 
         $end=false; 
        } 
        if($end) 
        { 
          break;   
        } 
        else 
        { 
         $array3[] = array($l,$i,'-'); 
         $array3[] = array($k,$j,'+'); 
        } 
        //---------------------End Find Changes--------------------// 
       } 
       else 
       { 
        $array3[] = array($k,$j,'+'); 
       } 
      } 
      else 
      { 
       $array3[] = array($k,$i,'-'); 
      } 

     } 
    } 

    $array3[] = array(0,count($array1),'='); 
    return array($array1,$array2,$array3); 
} 
+2

應該做的功能是什麼? – SorinV 2009-06-05 18:36:57

+0

不好意思,這個函數需要兩次叮咬,找出它們之間的差異,添加了哪些單詞,哪些已被拿走。 – Mijoja 2009-06-05 22:51:31

回答

5

不要重新發明輪子。這就是那種容易出錯而且難以正確處理的事情。

查看Text_Diff梨包裝。我已經將它用於這種事情,它做得很好。