Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Ciagi - roznica
Forum PHP.pl > Forum > PHP
my_kel
Witam
Mam szybkie pytanko.
W bazie mam ciag znakow (cyfry, litery).
Teraz user dodaje lub usuwa cos z tych znakow.
Potrzebuje teraz wiedzec co zmienil.

I tu mam problem, bo nie moge wymyslic f-cji ktora by mi dawala roznice
tych ciagow.
Np w bazie bylo: 12 n 345 u+
User wpisal: 12 4 n 34 u+
Chce by mi wyswietlil: "Wpisano 4, usunieto 5"
Czy ktos moze mi pomoc.
MIeszam juz od rana w f-cjach operujacych na ciagach, ale wciaz nic.
Pozdr.
MS
strife
Sklepałem coś takiego, może pomorze:
  1. <?php
  2.  
  3. function change_info( $first_string, $change_string )
  4. {
  5.  
  6. $if = strlen( $first_string ) > strlen( $change_string ) ? $iHow = strlen( $first_string ) : $iHow = strlen( $change_string );
  7.  
  8. for ( $i = 0; $i < $iHow ; $i++ )
  9. {
  10.  
  11. if ( $first_string{$i} == $change_string{$i} )
  12. {
  13.  
  14. $_string_first .= $first_string{$i};
  15. $_string_two  .= $change_string{$i};
  16.  
  17. }
  18. else
  19. {
  20.  $_string_first .= '<span style=\"color: red\"><b>' . $first_string{$i} . '</b></span>';
  21.  $_string_two  .= '<span style=\"color: red\"><b>' . $change_string{$i} . '</b></span>';
  22.  
  23.  $all_string .= 'Znak \"<b>' . $first_string{$i} . '</b>\" został zmieniony na: \"<b>' . $change_string{$i} . '</b>\" (' . ( $i + 1 ) . &#092;") <br /> n\";
  24.  
  25. }
  26.  
  27. }
  28.  
  29. echo $_string_first . '<br />';
  30. echo $_string_two . '<br /><br />' ;
  31.  
  32. echo $all_string;
  33.  
  34.  
  35.  
  36. }
  37.  
  38. $first_string = '12 n 345 u+'; // string w bazie
  39. $change_string  = '12 4 n 34 u+';  // string wpisany przez usera
  40.  
  41. change_info( $first_string, $change_string );
  42.  
  43. ?>
tarlandil
Prosta implementacja algorytmu LCS.

  1. <?php
  2.  
  3.  
  4. function lcs($s1,$s2)
  5. {
  6. $len1=strlen($s1);
  7. $len2=strlen($s2);
  8.  
  9. $lcstab=array();
  10. for ($i1=0;$i1<=$len1;$i1++) $lcstab[$i1]=array();
  11.  
  12. for ($i2=0;$i2<=$len2;$i2++) $lcstab[0][$i2]=$i2;
  13. for ($i1=0;$i1<=$len1;$i1++)
  14. {
  15. $lcstab[$i1][0]=$i1;
  16.  
  17. for ($i2=0;$i2<=$len2;$i2++) if ($s1[$i1-1]==$s2[$i2-1]) $lcstab[$i1][$i2]=$lcstab[$i1-1][$i2-1]; else
  18. $lcstab[$i1][$i2]=1+min($lcstab[$i1-1][$i2],$lcstab[$i1][$i2-1]);
  19.  
  20. }
  21. $result=array( changes1=> array(), changes2 => array());
  22. $i1=$len1;
  23. $i2=$len2;
  24. while ($i1||$i2)
  25. {
  26. if ($s1[$i1-1]==$s2[$i2-1]) 
  27. {
  28. $i1--;$i2--;
  29. } else
  30. {
  31. if ($i1&&$lcstab[$i1-1][$i2]+1==$lcstab[$i1][$i2]) 
  32. {
  33. $result[&#092;"changes1\"][$i1-1]=\"usuniety\";
  34. $i1--;
  35. } else
  36. {
  37. $result[&#092;"changes2\"][$i2-1]=\"dodane\";
  38. $i2--;
  39. }
  40. }
  41. }
  42. return $result;
  43. }
  44.  
  45.  
  46.  
  47. $s1='12 n 345 u+';  
  48. $s2='12 4 n 34 u+';
  49.  
  50. $result=lcs($s1,$s2);
  51.  
  52. $len1=strlen($s1);
  53. $len2=strlen($s2);
  54.  
  55. echo &#092;"<pre>\";
  56. for ($i=0;$i<$len1;$i++)
  57. {
  58. if ($result[&#092;"changes1\"][$i]) echo \"<span style='background: red'>{$s1[$i]}</span>\"; else echo \"{$s1[$i]}\";
  59. }
  60. echo &#092;"n\";
  61.  
  62. for ($i=0;$i<$len2;$i++)
  63. {
  64. if ($result[&#092;"changes2\"][$i]) echo \"<span style='background: green'>{$s2[$i]}</span>\"; else echo \"{$s2[$i]}\";
  65. }
  66. echo &#092;"n\";
  67.  
  68. echo &#092;"</pre>\";
  69. ?>


Zlozonosc dlugosc_pierwszego*dlugosc_drugiego -> wiec dla malych ciagow bedzie dzialac ok, ale dla dlugich nie polecam ;]

To samo robi tez funkcja:
http://www.php.net/manual/en/function.levenshtein.php
my_kel
Witam
Otoz to wlasnie. Mala modyfikacja i dziala lux.
Wielkie dzieki.
Pozdr
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.