tôi nghĩ rằng bạn cần một cái gì đó giống như chức năng mảng diff đầy đủ của tôi:
/**
Full Array Diff implemented in pure php, written from scratch.
Copyright (C) 2011 Andres Morales <[email protected]>
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
http://www.gnu.org/licenses/gpl.html
About:
I needed a function to compare a email and its response but array_diff()
does not cover my expectations. So I reimplement a full array diff function.
You can use it directly in your code and adopt to your needs.
Contact:
[email protected] <Andres Morales>
**/
function farray_diff($array1, $array2){
$out = array();
$max_arr = count($array1) > count($array2)? count($array1) : count($array2);
$i = 0;
$j = 0;
while($i < $max_arr && $j< $max_arr){
if($array1[$i] == $array2[$j]){
array_push($out, $array1[$i]);
}
else {
if(in_array($array1[$i], array_slice($array2, $j))){
for($k = $j; $k<$max_arr; $k++){
if($array1[$i]==$array2[$k]){
array_push($out, $array2[$k]);
$j = $k;
break;
}
else{
array_push($out, array('o' => '', 'n' => $array2[$k]));
}
}
}
elseif(in_array($array2[$j], array_slice($array1, $i))){
for($k = $i; $k<$max_arr; $k++){
if($array2[$j]==$array1[$k]){
array_push($out, $array1[$k]);
$i = $k;
break;
}
else {
array_push($out, array('o' => $array1[$k], 'n' => ''));
}
}
}
else{
if(!empty($array1[$i]))
array_push($out, array('o' => $array1[$i], 'n' => $array2[$j]));
else
array_push($out, array('o' => '', 'n' => $array2[$j]));
}
}
$i++; $j++;
}
return $out;
}
vì vậy, bạn chỉ có thể sử dụng nó như trong ví dụ sau:
$str1 = "This is a simple text that can you reply, so can you do it?";
$str2 = "I response in your text: This is a simple text (no so simple) that can be replied, so can you do it? Yes, I can!";
// Printing the full array diff of single space exploded strings
print_r(farray_diff(explode(' ', $str1), explode(' ', $str2)));
Returns:
Array
(
[0] => Array
(
[o] =>
[n] => I
)
[1] => Array
(
[o] =>
[n] => response
)
[2] => Array
(
[o] =>
[n] => in
)
[3] => Array
(
[o] =>
[n] => your
)
[4] => Array
(
[o] =>
[n] => text:
)
[5] => This
[6] => is
[7] => a
[8] => simple
[9] => text
[10] => Array
(
[o] =>
[n] => (no
)
[11] => Array
(
[o] =>
[n] => so
)
[12] => Array
(
[o] =>
[n] => simple)
)
[13] => that
[14] => can
[15] => Array
(
[o] =>
[n] => be
)
[16] => Array
(
[o] =>
[n] => replied,
)
[17] => Array
(
[o] =>
[n] => so
)
[18] => Array
(
[o] =>
[n] => can
)
[19] => you
[20] => Array
(
[o] => reply,
[n] =>
)
[21] => Array
(
[o] => so
[n] =>
)
[22] => Array
(
[o] => can
[n] =>
)
[23] => Array
(
[o] => you
[n] =>
)
[24] => do
[25] => it?
[26] => Array
(
[o] =>
[n] => Yes,
)
[27] => Array
(
[o] =>
[n] => I
)
[28] => Array
(
[o] =>
[n] => can!
)
Nó giống như một khác biệt đơn giản, nhưng không có "+" và "-", cả hai đã được thay thế sau khi phân tích cú pháp dễ dàng bằng phím "o" (cũ) và "n" (cho mới).Và bạn có thể sử dụng chức năng sau đây để phân tích kết quả:
function format_response($diff_arr){
$new = false;
echo '<span class="old">';
foreach($diff_arr as $item)
{
$content = '';
if (!is_array($item)){
$new = false;
$content = $item;
}
else
if (empty($item['o']) && !empty($item['n'])){
$new = true;
$content = $item['n'];
}
if($old_new != $new){
if($new)
echo '</span><span class="new">';
else
echo '</span><span class="old">';
}
echo $content . (!empty($content)?' ':'');
$old_new = $new;
}
echo '</span>';
}
Vì vậy, thay vì sử dụng một cách đơn giản "print_r" bạn có thể phân tích các mảng sử dụng:
format_response(farray_diff(explode(' ', $str1), explode(' ', $str2)));
và bạn có được (sau đây ví dụ) một cái gì đó như thế này:
<span class="old"></span><span class="new">I response in your text: </span><span class="old">This is a simple text </span><span class="new">(no so simple) </span><span class="old">that can </span><span class="new">be replied, so can </span><span class="old">you do it? </span><span class="new">Yes, I can! </span>
Rõ ràng, để hiển thị một cách chính xác kết quả bạn trước khi cần phải xác định các css "cũ" và lớp "mới" với một số diference, pex: khác nhau màu foreground:
<style>.old{color: #808080;}.new{color:#000000}</style>
cho email html hoặc bạn có thể sửa đổi hàm format_response để hiển thị email không có html.
LƯU Ý: Vì bạn có thể thấy các chức năng của tôi là phần mềm tự do và nằm trong Giấy phép Công cộng GNU.
Hy vọng nó sẽ giúp bạn.
Tôi đoán họ có rất nhiều dữ liệu thử nghiệm và đã phát triển thuật toán "bí mật". – jantimon
Đây có thể là một biến thể trong quá trình "khác biệt" - so sánh thông điệp mới với nội dung của (các) cũ. Tôi sẽ đề nghị nghiên cứu dọc theo dòng đó. –