Php dize fark fonksiyonunu optimize yardıma mı ihtiyacınız var

1 Cevap php

Ben bu işlevi oluşturulan ve küçük dizeleri üzerinde çalışır, ancak daha uzun dizeleri için zaman aşımına. Ben fonksiyon iş daha hızlı değil, timeout yapmak için bir yol, ya da ne istediğinizi gerçekleştirmek için daha iyi bir yol arıyorum.

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);
}

1 Cevap

Tekerleği yeniden icat etmeyin. Bu hakkı elde etmek yanlış ve zor almak kolay türden bir şey olduğunu.

Text_Diff Armut Paketi göz atın. Ben bu tür bir şey için kullanmış ve çok iyi yapılır.