突出显示 PHP 中顺序不同的单词

highlight sequentially different word in PHP

我想突出显示 PHP 中 2 个字符串单词之间的顺序差异, 假设我有 2 个字符串,如下所示。

$string1 = "TO THE ORDER OF United Bank Limited Arab -09254 DT:17-06-20212 ADS";
$string2 = "Arab TO THE ORDER OF United Bank Limited Arab TO -092541 KDS DT:17-06-20212";

突出显示的单词应该是 Arab To -092541KDS。 到目前为止,我已经尝试了下面的代码。

<?php
function compare_strings($array1, $array2) {
$array1 = explode(" ", $array1);
$array2 = explode(" ", $array2);
$arSize1=count($array1);
$arSize2=count($array2);
$index=0;
  if($arSize1<$arSize2){
    for($i=0;$i<$arSize1;$i++){
      if($array1[$i]==$array2[($i+$index)]){
          echo ' '.$array1[$i];
      }
      else{
          echo ' <b>'.$array2[($i+$index)].'</b>'; 
          $index++;
          $i--;
      }
    }

  }
}
$string1 = "TO THE ORDER OF United Bank Limited Arab -09254 DT:17-06-20212 ADS";
$string2 = "Arab TO THE ORDER OF United Bank Limited Arab TO -092541 KDS DT:17-06-20212";
echo $string1.'<br/>';
compare_strings($string1,$string2);
?>

如果我只添加单词,例如 Arab ToKDS,并且不更改现有单词 -092541,则此代码可以正常工作。 当我将 -09254 更改为 -092541 时,它开始无限循环并显示 Undefined array key 错误。

预期突出显示的词是 Arab TO -092541 KDS

我尝试了以下 answers/libraries,但其中 none 适合我的情况。

@Arif 's answer for a similar question
Side-by-side
class.Diff.php

任何 help/guidance 将不胜感激。

你的代码太复杂了……这就是你进入无限循环的原因……

这里有一个 foreach 循环的建议,在这个例子中你不需要关心你的数组有多长,因为你正在检查来自你正在循环的数组的单词是否出现在另一个数组中。 .. 所以你已经检查了数组中的所有单词。

这意味着如果您使用 in_array() 之类的东西,您将知道该词是否出现在另一个数组中。

所以这里是对您的代码的一个小改动:

<?php
function show_unique_strings($array1, $array2) {

    $array1 = explode(" ", $array1);
    $array2 = explode(" ", $array2);


    foreach ($array2 as $a2Val){

        $nKey = in_array($a2Val,$array1);
        if($nKey > 0){
            echo "<b> $a2Val </b>";
        } else {
            echo " $a2Val";
        }

    }

}

$string1 = "TO THE ORDER OF United Bank Limited Arab -09254 DT:17-06-20212 ADS";
$string2 = "Arab TO THE ORDER OF United Bank Limited Arab TO -092541 KDS DT:17-06-20212";
echo $string1.'<br/>';
show_unique_strings($string1,$string2);
?>

将输出:

阿拉伯联合银行有限公司的订单 -09254 DT:17-06-20212 ADS

Arab TO United Bank Limited Arab 的订单 TO -092541 KDSDT:17-06-20212

这样我们不关心我们是否只在第二个数组上 运行 因为对于每个单词我们都会检查并回显一个或另一个......不需要计数并跟随我们的键所有...:)

simplediff 库完成了我的工作,我只需修改代码即可满足我的要求。

<?php
function diff($old, $new){
    $matrix = array();
    $maxlen = 0;
    foreach($old as $oindex => $ovalue){
        $nkeys = array_keys($new, $ovalue);
        foreach($nkeys as $nindex){
            $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];
                $omax = $oindex + 1 - $maxlen;
                $nmax = $nindex + 1 - $maxlen;
            }
        }   
    }
    if($maxlen == 0) return array(array('d'=>$old, 'i'=>$new));
    return array_merge(
        diff(array_slice($old, 0, $omax), array_slice($new, 0, $nmax)),
        array_slice($new, $nmax, $maxlen),
        diff(array_slice($old, $omax + $maxlen), array_slice($new, $nmax + $maxlen)));
}

$string1 = "TO THE ORDER OF United Bank Limited Arab -09254 DT:17-06-20212 ADS";
$string2 = "Arab TO THE ORDER OF United Bank Limited Arab TO -092541 KDS DT:17-06-20212";
$arr=diff(explode(" ",$string1),explode(" ",$string2));
echo $string1.'<br/>';
$ret = '';
foreach($arr as $k){
        if(is_array($k)){
            $ret .= (!empty($k['i'])?"<b>".implode(' ',$k['i'])."</b> ":'');
        }
        else {
          $ret .= $k . ' ';
        }
    }
echo $ret;
?>

输出:

阿拉伯联合银行有限公司的订单 -09254 DT:17-06-20212 ADS
Arab TO THE ORDER OF United Bank Limited Arab TO -092541 KDS DT:17-06-20212