0

我想在 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 -092541and KDS。到目前为止,我已经尝试了下面的代码。

<?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 To并且KDS不更改现有单词-092541。当我更改-09254-092541它时,它会启动一个无限循环并显示Undefined array key错误。

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

我尝试了以下答案/库,但这些都不适用于我的情况。

@Arif 对类似问题的回答
Side-by-side
class.Diff.php

任何帮助/指导将不胜感激。

4

2 回答 2

0

你的代码过于复杂......这就是你进入无限循环的原因......

这是一个关于 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);
?>

将输出:

根据 United Bank Limited 阿拉伯 -09254 DT:17-06-20212 ADS 的订单

阿拉伯 TO THE ORDER OF United Bank Limited 阿拉伯 TO -092541 KDS DT:17-06-20212

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

于 2021-10-21T07:51:44.800 回答
0

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;
?>

输出:

根据 United Bank Limited 阿拉伯订单 -09254 DT:17-06-20212 ADS
Arab根据 United Bank Limited 阿拉伯订单-092541 KDS DT :17-06-20212

于 2021-10-21T13:27:18.360 回答