Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]częstość występowania znaku w ciągu
marekdominikowsk...
post
Post #1





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 16.11.2013

Ostrzeżenie: (0%)
-----


Cześć

Nie wiem jak rozwiązać taki problem. Mam tabelę w bazie danych, w której kolejne rekordy mają takie przykładowe wartości:

1. B B C A D A B C A C
2. A B C A B C D A B A
3. A C D B A A B A C C

Teraz potrzebuję pobrać taki rekord i przetworzyć go następująco. Liczę, które miejsce w szeregu zajmuje konkretna wartość, np. "A", i zapisuję wynik. Następnie zeruję licznik i liczę dalej do kolejnego wystąpienia "A" i zapisuję wynik. Jeśli ostatni ciąg kończy się daną wartością, dopisujemy 0 (brak kolejnych wartości). W efekcie powinienem dla podanych przykładów otrzymać takie wyniki:

1. 4 2 3 1 ("A" było czwarte, potem drugie, potem trzecie a następnie wystąpił ciąg niezakończony wartością "A" o długości 1 - musi być jakoś wyróżniony)
2. 1 3 4 2 0
3. 1 4 1 2 2

Prawdę mówiąc, nie wiem jak się do tego zabrać. Nie wiem czy jest jakaś funkcja, która coś takiego zrobi. Jedyne co przyszło mi do głowy to policzyć miejsca, na których "A" występuje i odejmować je od siebie. Czyli dla rekordu 2 działałoby to tak:

"A" jest 1, 4, 8 i 10. Długość ciągu = 10.
10 - 10 = 0 ("A" jest ostatnie)
10 - 8 = 2
8 - 4 = 4
4 - 1 = 3
1 - 0 = 1

Otrzymuję 0 2 4 3 1 i odwracam sobie do 1 3 4 2 0.

Niestety nie wiem jak to wykonać.

Pozdrawiam
Go to the top of the page
+Quote Post
CuteOne
post
Post #2





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

Ostrzeżenie: (0%)
-----


  1. $pos = array();
  2. $k = 0;
  3. $string = 'abcadeafa';
  4. $len = strlen($string);
  5.  
  6. for($i=0;$i<$len;$i++) {
  7. if($string[$i] === 'a') {
  8. if(($i+1) == $len) {
  9. $pos[] = 0;
  10. } else {
  11. $pos[] = $i - $k + 1;
  12. $k = $i;
  13. }
  14. }
  15. }
  16. echo implode(' ', $pos);


Ten post edytował CuteOne 21.11.2013, 14:18:21
Go to the top of the page
+Quote Post
marekdominikowsk...
post
Post #3





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 16.11.2013

Ostrzeżenie: (0%)
-----


Dziękuję za szybką odpowiedź. Sprawdziłem ale niestety podaje zły wynik. Podaje o jedną serię mniej a te począwszy od drugiej powiększa o 1. Muszę się temu dokładnie przyjrzeć i może uda mi się to wykorzystać.

Ten post edytował marekdominikowski 21.11.2013, 14:48:45
Go to the top of the page
+Quote Post
CuteOne
post
Post #4





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

Ostrzeżenie: (0%)
-----


Usuń "+ 1"
Go to the top of the page
+Quote Post
marekdominikowsk...
post
Post #5





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 16.11.2013

Ostrzeżenie: (0%)
-----


Już widzę czego brakuje!
  1.  
  2. <?php
  3. $pos = array();
  4. $k = 0;
  5. $string = 'abab';
  6. $len = strlen($string);
  7.  
  8.  
  9. for($i=0;$i<$len;$i++) {
  10. if($string[$i] === 'a') {
  11. if(($i+1) == $len) {
  12. $pos[] = $i - $k + 1;
  13. $pos[] = 0;
  14. } else {
  15. $pos[] = $i - $k + 1;
  16. $k = $i + 1;
  17. }
  18. } else {
  19. if(($i+1) == $len) {
  20. $pos[] = $i - $k + 1;
  21. }
  22. }
  23. }
  24. echo implode(' ', $pos);
  25. ?>
  26.  


Ten licznik $k należało zwiększyć o 1 po znalezieniu "a", dodać sprawdzanie czy znak inny niż "a" nie jest przypadkiem ostatni i oprócz wstawienia 0 wpisać też długość ostatniej serii.

Wielkie dzięki! Bardzo mi pomogłeś!

Ten post edytował marekdominikowski 21.11.2013, 16:16:18
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 19:47