Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]częstość występowania znaku w ciągu
Forum PHP.pl > Forum > Przedszkole
marekdominikowski
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
CuteOne
  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);
marekdominikowski
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ć.
CuteOne
Usuń "+ 1"
marekdominikowski
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ś!
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.