-1

2 つのファイルの違いを確認するための PHP 4 コードがあります。これは PHP 4 バージョンの古いサーバーでは問題なく動作しますが、新しいサーバーではエラーが発生します。例えば:

$maxlen定義されていません

そして、機能的には新しいサーバーでは機能していません。最近のPHPバージョンでこれを変更する方法を知っている人はいますか?

 function diff($old, $new){ 
            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))); 
    } 

    function htmlDiff($old, $new){ 
    $preg="/[\s,]+/";
        $old=str_replace(">","> ",$old);
        $new=str_replace(">","> ",$new);
        $old=str_replace("<"," <",$old);
        $new=str_replace("<"," <",$new);

        $diff = diff(preg_split($preg, $old),preg_split($preg, $new)); 
        foreach($diff as $k){ 
        if(is_array($k)) 
            $ret .= (!empty($k['d'])?"<div style='BACKGROUND-COLOR: red'>".implode(' ',$k['d'])."</div> ":''). 
            (!empty($k['i'])?"<div style='BACKGROUND-COLOR: yellow'>".implode(' ',$k['i'])."</div> ":''); 
            else $ret .= $k . ' '; 
        } 
        return $ret; 
    } 
    function creatediff($oldurl,$newurl,$diffurl){ 
        $sold= file_get_contents($oldurl);
        $snew= file_get_contents($newurl);
        $diff=htmlDiff($sold,$snew);
        $diff=preg_replace('#(href|src)="([^:"]*)("|(?:(?:%20|\s|\+)[^"]*"))#','$1="'.$newurl.'/$2"',$diff);
        file_put_contents($diffurl,$diff);
    }
4

2 に答える 2

1

これはバージョンの違いによるものではなく、悪いコードです。おそらくerror_reporting、以前のインストールでオフ/オフにしたため、表示されなかった可能性があります。PHP4 環境に戻り、 に設定error_reportingするとE_ALL、おそらく同じ警告のほとんどが表示されます。

特定の 1 つの条件が満たさ$maxlenれた場合にのみ定義されるため、他の場合には定義されず、警告が生成されます。これは、関数の先頭でif定義するか、変数を参照する前に使用することで回避できます。$maxlenisset()

于 2013-03-06T18:20:02.307 に答える
1

あなたのループには以下が含まれます:

if($matrix[$oindex][$nindex] > $maxlen)

しかし、最初のループで$maxlenは何も設定されていないため、この比較では (エラーではなく) 警告が生成されます。

$maxlenループの前に初期化するか、次のように変更する必要があります。

if (!isset($maxlen) || $matrix[$oindex][$nindex] > $maxlen)

もう 1 つの問題は$matrix、関数に配列がないことです。それがグローバル変数の場合は、次が必要です。

global $matrix;

関数の先頭に。

于 2013-03-06T18:20:22.333 に答える