यहां एक छोटा फ़ंक्शन है जिसका उपयोग आप दो सरणियों को फैलाने के लिए कर सकते हैं। यह एलसीएस एल्गोरिथ्म को लागू करता है:
function computeDiff($from, $to)
{
$diffValues = array();
$diffMask = array();
$dm = array();
$n1 = count($from);
$n2 = count($to);
for ($j = -1; $j < $n2; $j++) $dm[-1][$j] = 0;
for ($i = -1; $i < $n1; $i++) $dm[$i][-1] = 0;
for ($i = 0; $i < $n1; $i++)
{
for ($j = 0; $j < $n2; $j++)
{
if ($from[$i] == $to[$j])
{
$ad = $dm[$i - 1][$j - 1];
$dm[$i][$j] = $ad + 1;
}
else
{
$a1 = $dm[$i - 1][$j];
$a2 = $dm[$i][$j - 1];
$dm[$i][$j] = max($a1, $a2);
}
}
}
$i = $n1 - 1;
$j = $n2 - 1;
while (($i > -1) || ($j > -1))
{
if ($j > -1)
{
if ($dm[$i][$j - 1] == $dm[$i][$j])
{
$diffValues[] = $to[$j];
$diffMask[] = 1;
$j--;
continue;
}
}
if ($i > -1)
{
if ($dm[$i - 1][$j] == $dm[$i][$j])
{
$diffValues[] = $from[$i];
$diffMask[] = -1;
$i--;
continue;
}
}
{
$diffValues[] = $from[$i];
$diffMask[] = 0;
$i--;
$j--;
}
}
$diffValues = array_reverse($diffValues);
$diffMask = array_reverse($diffMask);
return array('values' => $diffValues, 'mask' => $diffMask);
}
यह दो सरणियाँ उत्पन्न करता है:
- मान सरणी: तत्वों की एक सूची के रूप में वे अंतर में दिखाई देते हैं।
- मुखौटा सरणी: संख्याएँ होती हैं। 0: अपरिवर्तित, -1: हटाया, 1: जोड़ा गया।
यदि आप वर्णों के साथ किसी सरणी को पॉप्युलेट करते हैं, तो इसका उपयोग इनलाइन अंतर की गणना करने के लिए किया जा सकता है। मतभेदों को उजागर करने के लिए अब सिर्फ एक कदम:
function diffline($line1, $line2)
{
$diff = computeDiff(str_split($line1), str_split($line2));
$diffval = $diff['values'];
$diffmask = $diff['mask'];
$n = count($diffval);
$pmc = 0;
$result = '';
for ($i = 0; $i < $n; $i++)
{
$mc = $diffmask[$i];
if ($mc != $pmc)
{
switch ($pmc)
{
case -1: $result .= '</del>'; break;
case 1: $result .= '</ins>'; break;
}
switch ($mc)
{
case -1: $result .= '<del>'; break;
case 1: $result .= '<ins>'; break;
}
}
$result .= $diffval[$i];
$pmc = $mc;
}
switch ($pmc)
{
case -1: $result .= '</del>'; break;
case 1: $result .= '</ins>'; break;
}
return $result;
}
उदाहरण के लिए .:
echo diffline('StackOverflow', 'ServerFault')
उत्पादन होगा:
S<del>tackO</del><ins>er</ins>ver<del>f</del><ins>Fau</ins>l<del>ow</del><ins>t</ins>
एसTackoerverचफॉलओउटी
अतिरिक्त नोट्स:
- भिन्न मैट्रिक्स के लिए (m + 1) * (n + 1) तत्वों की आवश्यकता होती है। यदि आप लंबे अनुक्रमों को अलग करने का प्रयास करते हैं तो आप मेमोरी त्रुटियों से बाहर निकल सकते हैं। इस मामले में पहले बड़े विखंडू (जैसे लाइनें) को अलग करें, फिर एक दूसरे पास में उनकी सामग्री को अलग करें।
- एल्गोरिथ्म में सुधार किया जा सकता है यदि आप शुरू और अंत से मिलान तत्वों को ट्रिम करते हैं, तो एल्गोरिथ्म को केवल अलग-अलग मध्य पर चलाएं। एक बाद (अधिक फूला हुआ) संस्करण इन संशोधनों को भी शामिल हैं।