Функция print_r () возвращает результат в виде простого «массива» для алгоритма сравнения - PullRequest
3 голосов
/ 08 февраля 2012

Я использую алгоритм сравнения ( Пола Батлера * ), с которым я теперь немного работал.Я обнаружил, что мне нужно mysql_fetch_array (), а не mysql_fetch_object (), что решает предупреждения и сообщения об ошибках, но теперь, когда я пытаюсь print_r () отобразить результат, результатом будет просто «Array» вместо поля из базы данныхМне нужно, чтобы он отображал и сравнивал ... когда я вызываю другую функцию, кажется, что она показывает поля, но не сравнивает их, а не перечисляет их дважды и с Array ( [0] => Array ( [d] => Array ( [0] => перед ним.

Есть идеи, почему?И да, я погуглил это, посмотрел и потратил около двух дней, пытаясь разобраться.

Вот части сценария:

    $oldhistory = mysql_query("SELECT history FROM members WHERE id = '$id'") or die(mysql_error());
    $oldhistory = mysql_fetch_array($oldhistory);

    $newhistory = mysql_query("SELECT history FROM profile_edit WHERE userid = '$id'") or die(mysql_error());   
    $newhistory = mysql_fetch_array($newhistory);

    $oldpersonality= mysql_query("SELECT personality FROM members WHERE id = '$id'") or die(mysql_error());
    $oldpersonality = mysql_fetch_array($oldpersonality);

    $newpersonality = mysql_query("SELECT personality FROM profile_edit WHERE userid = '$id'") or die(mysql_error());   
    $newpersonality = mysql_fetch_array($newpersonality);

    $oldappearance = mysql_query("SELECT description FROM members WHERE id = '$id'") or die(mysql_error());
    $oldappearance = mysql_fetch_array($oldappearance);

    $newappearance = mysql_query("SELECT personality FROM profile_edit WHERE userid = '$id'") or die(mysql_error());    
    $newappearance = mysql_fetch_array($newappearance);

    echo "
      <form action=\"$PHP_SELF?id=$id&s=a\" method=\"post\">
      <table cellpadding=\"5\" cellspacing=\"1\" border=\"0\" align=\"center\" bgcolor=\"#234904\">
        <tr bgcolor=\"#000000\">
         <td>History :: </td>
         <td> 
";

function diffhistory($oldhistory, $newhistory){

foreach($oldhistory as $oindex => $ovalue){
        $nkeys = array_keys($newhistory, $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'=>$oldhistory, 'i'=>$newhistory));
    return array_merge(
        diffhistory(array_slice($oldhistory, 0, $omax), array_slice($newhistory, 0, $nmax)),
        array_slice($newhistory, $nmax, $maxlen),
        diffhistory(array_slice($oldhistory, $omax + $maxlen), array_slice($newhistory, $nmax + $maxlen)));
}

function htmlDiffHistory($oldhistory, $newhistory){
    $diffhistory = diffhistory(explode(' ', $oldhistory), explode(' ', $newhistory));
    foreach($diffhistory as $k){
        if(is_array($k))
            $ret .= (!empty($k['d'])?"<del><color=red>".implode(' ',$k['d'])."</color></del> ":'').
                (!empty($k['i'])?"<ins><color=green>".implode(' ',$k['i'])."</color></ins> ":'');
        else $ret .= $k . ' ';
    }
    return $ret;

}
print_r (diffhistory($oldhistory, $newhistory));

Ответы [ 2 ]

1 голос
/ 08 февраля 2012

Возможно, вам просто нужно использовать mysql_fetch_assoc() (или, возможно, mysql_fetch_row()), чтобы считать данные из базы данных как ассоциативно ИЛИ проиндексированные, а не как оба, но я подозреваю, что ваш подход довольно некорректен - с одной стороны Вы делаете 6 запросов, где один будет делать. Вы также передаете массив с одним значением функции, которая, как я подозреваю, ожидает сравнения двух массивов с несколькими значениями.

Попробуйте вместо этого ( EDITED на основе комментариев ниже):

<?php

  function diff($old, $new){
    $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;
        }
      } 
    }
    return ($maxlen == 0)
      ? array(array('d'=>$old, 'i'=>$new))
      : 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){
    $ret = '';
    $diff = diff(preg_split('/\s+/', $old), preg_split('/\s+/', $new));
    foreach ($diff as $k) {
      if (is_array($k)) {
          $ret .= (!empty($k['d']) ? "<del style='color:red'>".implode(' ',$k['d'])."</del> " : '')
                . (!empty($k['i']) ? "<ins style='color:green'>".implode(' ',$k['i'])."</ins> " : '');
      } else {
        $ret .= $k . ' ';
      }
    }
    return $ret;
  }

  $query = "
    SELECT
      `m`.`history`, `p`.`history` AS 'p_history',
      `m`.`personality`, `p`.`personality` AS 'p_personality',
      `m`.`description`, `p`.`description` AS 'p_description'
    FROM `members` `m`
    JOIN `profile_edit` `p` ON `p`.`userid` = `m`.`id`
    WHERE `m`.`id` = '".mysql_real_escape_string($id)."'
    LIMIT 1
  ";

  $result = mysql_query($query) or die(mysql_error());
  $data = mysql_fetch_assoc($result);

  echo "
    <form action=\"$PHP_SELF?id=$id&s=a\" method=\"post\">
      <table cellpadding=\"5\" cellspacing=\"1\" border=\"0\" align=\"center\" bgcolor=\"#234904\">
        <tr bgcolor=\"#000000\">
          <td>History :: </td>
          <td>".htmlDiff(htmlspecialchars($data['history']), htmlspecialchars($data['p_history']))."</td>
        </tr>
        <tr bgcolor=\"#000000\">
          <td>Personality :: </td>
          <td>".htmlDiff(htmlspecialchars($data['personality']), htmlspecialchars($data['p_personality']))."</td>
        </tr>
        <tr bgcolor=\"#000000\">
          <td>Description :: </td>
          <td>".htmlDiff(htmlspecialchars($data['description']), htmlspecialchars($data['p_description']))."</td>
        </tr>
      </table>
    </form>";
0 голосов
/ 08 февраля 2012

Попробуйте напечатать, используя var_dump, если это просто для проверки данных внутри вашего массива:

echo '<pre>'; var_dump($yourArray); echo'</pre>';

...