Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Podmiana znaków w tekście
Forum PHP.pl > Forum > Przedszkole
blondii
Witam,

Mam pewien problem z podmianą znaków w tekście. Sytuacja wygląda następująco: mam pewien łańcuch tekstowy w postaci np. 2341X4E1R. W tablicy każdej literze (w tym przypadku jest to X,E i R) przyporządkowane są pewne cyfry np. X -> 1; E-> 2,4,5; R-> 0,7. Z tego wynika, że dla tego łańcucha tekstowego może powstać 6 innych (1*3*2).

Przykład.

Mamy dwie tablice. W jednej zapisane są kody a w drugiej odpowiadające im cyfry (elementowi j z tablicy $kody odpowiada element j z tablicy $cyfry):
  1. $kody = array("A","A","A","B","C","C","DX","DX","DX","DX","TO","TO","PW");
  2. $cyfry = array("1","3","5","7","4","6","2","3","4","5","0","9","8");


Chodzi o to, że na wejście dostajemy ciąg znaków taki jak (zawiera 3 kody):
  1. 270A174DX2PW


Na wyjściu powinniśmy dostać 12 różnych ciągów (3*4*1):
  1. 2701174228
  2. 2703174228
  3. 2705174228
  4. 2701174328
  5. 2703174328
  6. 2705174328
  7. 2701174428
  8. 2703174428
  9. 2705174428
  10. 2701174528
  11. 2703174528
  12. 2705174528




Problem jest tego typu, że ciąg na wejściu może być:
a) różnej długości
b) zawierać różną ilość kodów np. w jednym może być 1, w drugim 5, a w trzecim 3 kody
c) każdemu kodowi odpowiada różna ilość cyfr (w przykładzie kodowi A odpowiadają 3 cyfry a kodowi DX 4)

Jak zrobić taką zamianę w najlepszy sposób?

Z góry dzięki
Pozdrawiam
Morfi777
Nie wiem czy najlepszy, ale działający ohmy.gif


  1. <?
  2.  
  3. $Input = "270A174DX2PW";
  4.  
  5. /**/
  6.  
  7. $start = microtime();
  8.  
  9. $kody = array("A","A","A","B","C","C","DX","DX","DX","DX","TO","TO","PW");
  10. $cyfry = array("1","3","5","7","4","6","2","3","4","5","0","9","8");
  11. $Merge = array( );
  12. $NoD = array_flip($kody);
  13. $Count = count($kody);
  14.  
  15.  
  16. for( $x = 0; $x < $Count; $x++ )
  17. {
  18. if( array_key_exists($kody[$x], $Merge) )
  19. array_push($Merge[$kody[$x]], $cyfry[$x]);
  20. else
  21. $Merge[$kody[$x]] = array($cyfry[$x]);
  22. }
  23.  
  24.  
  25. function qwe($String)
  26. {
  27. $TEMP = '';
  28.  
  29. foreach ( $GLOBALS["NoD"] as $key => $random )
  30. {
  31. if(strpos($String, $key))
  32. {
  33. foreach($GLOBALS["Merge"][$key] as $val)
  34. $TEMP .= str_replace($key, $val, $String) . ':';
  35.  
  36. $String = $TEMP;
  37. $TEMP = '';
  38.  
  39. }
  40. }
  41.  
  42. return $String;
  43.  
  44. }
  45.  
  46. /**/
  47.  
  48. $Boom = explode(':', qwe($Input));
  49.  
  50. $Count = count($Boom);
  51.  
  52. for( $x = 0; $x < $Count; $x++ )
  53. print $Boom[$x] . '<br />';
  54.  
  55. print 'Exec: ' . ( microtime() - $start ) . 's';
  56.  
  57. ?>
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.