php实现diff
PHP实现Diff算法
PHP中实现文件或字符串差异比较(diff)可以通过内置函数或第三方库完成。以下是几种常见方法:
使用内置函数array_diff
对于简单数组差异比较,PHP提供array_diff系列函数:
$array1 = [1, 2, 3, 4];
$array2 = [3, 4, 5, 6];
$diff = array_diff($array1, $array2); // 返回[1, 2]
使用xdiff扩展
需安装xdiff扩展(pecl install xdiff):
$file1 = 'old.txt';
$file2 = 'new.txt';
$diff = xdiff_file_diff($file1, $file2, 'diff.patch');
实现经典Diff算法

以下是基于LCS(最长公共子序列)的简单实现:
function computeDiff($old, $new) {
$matrix = [];
$maxlen = 0;
foreach($old as $oindex => $ovalue) {
foreach($new as $nindex => $nvalue) {
if ($ovalue == $nvalue) {
$matrix[$oindex][$nindex] = isset($matrix[$oindex-1][$nindex-1])
? $matrix[$oindex-1][$nindex-1] + 1
: 1;
if ($matrix[$oindex][$nindex] > $maxlen) {
$maxlen = $matrix[$oindex][$nindex];
}
}
}
}
return $maxlen;
}
使用第三方库
推荐使用以下成熟的diff库:

-
caxy/php-diff:提供HTML格式的差异输出
require 'vendor/autoload.php'; $diff = new Diff($oldArray, $newArray); $renderer = new Diff_Renderer_Html_SideBySide(); echo $diff->render($renderer); -
sebastian/diff:PHPUnit作者开发的差异库
$differ = new SebastianBergmann\Diff\Differ; echo $differ->diff('old text', 'new text');
可视化Diff输出
对于Web应用,可通过CSS美化diff输出:
<style>
.diff-added { background: #cfc; }
.diff-removed { background: #fcc; }
</style>
<?php
echo $diff->render(new Diff_Renderer_Html_Inline());
?>
性能优化建议
处理大文件时考虑以下优化:
- 使用流式处理而非全部加载到内存
- 设置合理的超时时间
- 对超过1MB的文件考虑分块比较
以上方法覆盖了从简单到复杂的diff需求,可根据具体场景选择合适方案。






