實現一個簡單的類似Git的橫向對比文件不同的demo
思路:首先對於兩個不同的文件夾而言,使用PHP自帶的$_FILE函數可以得到文件的名稱,創建時間,最後修改時間等內容,可以進行對比,若有不同的信息,則將文件夾進行遍歷,並進一步遞歸的進行查詢文件和文件夾信息,找到所有不同的文件之後,仍舊使用PHP自帶的file函數讀取文件內容,讀取的返回結果爲一個鍵值遞增的字符串數組;將同名文件進行逐行對比,若發現不同信息,則可以使用一個flag數組進行標記;遍歷結束之後,輸出兩個文件內容並藉助flag標記標籤標記出不同的行即可
一個簡單的對比文件內容不同的demo實現如下:<?php
//讀取文件
$ofiledir = "./ofile/";
$nfiledir = "./nfile/";
$readfile1 = file($ofiledir."helloworld.php");
$readfile2 = file($nfiledir."helloworld.php");
$flag = array();
//逐行比較兩個文件內容,並對不同之處藉助$flag數組進行標記
for($i = 0;$i < max(count($readfile1),count($readfile2));$i ++)
{
if($readfile1[$i] === $readfile2[$i])
{
$first[] = $readfile1[$i];
$second[] = $readfile2[$i];
$flag[$i] = 0;
}
else
{
$first[] = $readfile1[$i];
$second[] = $readfile2[$i];
$flag[$i] = 1;
}
}
//echo count($first);
//var_dump($readfile);
?>
<html>
<head>
<title>gitmanage</title>
</head>
<style type="text/css">
.filecontent{
border:1px solid green;
width :600px;
float:left;
}
.blank{
border:1px solid green;
width :20px;
float:left;
}
</style>
<body>
<!-- 輸出原文件 -->
<div class="filecontent" style="float:left">
<?php
for($i = 0;$i < count($first);$i ++)
{
?>
<!-- 使用淺色背景標記發生變化的行內容 -->
<div class="filecontent" style="<?php if ($flag[$i] == 1) echo "background-color:CCFFCC"?>">
<!-- 輸出行號 -->
<div class="blank"><?php echo $i+1;?></div>
<!-- 輸出佔位符 -->
<div class="blank"> </div>
<!-- 使用script標籤來使輸出的<>之類的標籤內容不會被解釋爲標籤 -->
<script type="text/html" style='display:block'>
<?php
echo "$first[$i]"."\n";
?>
</script>
</div>
<?php
echo "\n";
}
?>
</div>
<!-- 輸出新文件 -->
<div class="filecontent" style="float:left">
<?php
for($i = 0;$i < count($second);$i ++)
{
?>
<!-- 使用淺色背景標記發生變化的行內容 -->
<div class="filecontent" style="<?php if ($flag[$i] == 1) echo "background-color:CCFFCC"?>">
<!-- 輸出行號 -->
<div class="blank"><?php echo $i+1;?></div>
<!-- 在發生變化的行內容前添加提示 -->
<div class="blank"><?php if ($flag[$i] == 0) echo " "; else echo "+";?></div>
<!-- 使用script標籤來使輸出的<>之類的標籤內容不會被解釋爲標籤 -->
<script type="text/html" style='display:block'>
<?php
echo "$second[$i]"."\n";
?>
</script>
</div>
<?php
echo "\n";
}
?>
</div>
</body>
</html>
顯示效果如圖:
遇到的困難:
在輸出php文件的時候,無法在html文件中逐行輸出php代碼(或者類似的"<#include>、<html>"標籤),原因如下:
<html>
<head>
<title>hello</title>
</head>
<body>
<?php
echo "<?php";
echo "echo 'hello world'";
echo "?>";
?>
</body>
</\html>
<!--
這段代碼的本意是輸出
<?php
echo "hello world";
?>
這個代碼段但是,在實際操作中,會將代碼段中的<?php 直接解析,導致輸出結果不理想
-->
解決方法:
使用div將需要輸出的代碼段包裹起來,並在script標籤中設置disblock
解決代碼如下
<?php
$arr = ['hello' => "<?php?>hello",
'world' => "<html></html>world",
'hi' => '<p></p>hi'];
?>
<html>
<?php
foreach($arr as $value)
{
?>
<script type="text/html" style='display:block'>
<?php echo $value; ?>
</script>
<?php
}
?>
</html>
如上圖所示,html和php着這種標籤並不會被解析