2013-03-06 2 views
-1

У меня есть код PHP 4 для проверки различий в двух файлах, это отлично работает на старых серверах с версиями PHP 4, но на новых серверах я получаю ошибки. Например:PHP 4 код дает ошибки на php 5

$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); 
    } 
+1

Пробовал руководство? http://php.net/manual/en/faq.migration5.php – Repox

+0

http://stackoverflow.com/questions/2487021/what-is-the-difference-betwen-variable-in-php4-and-php5 – apoq

+0

Откуда вы получаете '$ maxlen'? – codingbiz

ответ

1

Это не из-за разницы в версии, это плохой код. Вероятно, у вас было error_reporting выключено/выключено на вашей предыдущей установке, что, скорее всего, вы не видели. Вернитесь в среду PHP4, установите error_reporting на E_ALL, и вы, вероятно, увидите большинство подобных предупреждений.

Потому что $maxlen определяется только в том случае, если какое-либо конкретное условие if выполнено в других случаях и не генерирует предупреждение. Вы можете избежать этого, либо определяя $maxlen в верхней части своей функции, либо используя isset(), прежде чем пытаться ссылаться на переменную.

+0

да я все делаю на php 5, но не работал –

1

Ваш цикл содержит:

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

но первый раз через петлю, $maxlen не установлен ни к чему, так это сравнение генерирует предупреждение (не ошибка).

Вы должны либо инициализировать $maxlen перед циклом, или изменить его на:

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

Другая проблема заключается в том, что нет $matrix массива в функции. Если это глобальная переменная, вам необходимо:

global $matrix; 

в начале функции.

+0

Я отредактировал сценарий, как это все еще не работает с php 5 –

+0

Вы все еще получаете предупреждение о том, что '$ maxlen' не определено? – Barmar

 Смежные вопросы

  • Нет связанных вопросов^_^