Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MySQL] Wstawianie "liter" pomiędzy wyniki, <ul> w stylu spisu alfabetycznego
barat
post 18.05.2009, 11:00:27
Post #1





Grupa: Zarejestrowani
Postów: 183
Pomógł: 0
Dołączył: 19.05.2007

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


Witam.

Mam mały problem ... otoż pobieram sobie artykuły za pomocą zapytania:

  1. SELECT * FROM `artykuly` WHERE SUBSTR(`nazwa`, 1,1) BETWEEN 'a' AND 'd' ORDER BY `nazwa` ASC;


zakres a-d jest przykładowy ... (docelowo będą to A-D, E-H, I-L, M-P, Q-W, X-Z)

Wszystko działa ładnie, wybiera mi to co trzeba, mogę potem sobie zrobić z pobranych wierszy listę <ul>

W zasadzie mógłbym na tym poprzestać (w końcu mam listę z danym zakresem liter posortowaną alfabetycznie), ale wpadł mi do głowy pewien pomysł.

Aby lista była w stylu:

  1. <h3>A</h3>
  2. <ul>
  3. <li>Tytuły na A</li>
  4. ...
  5. </ul>
  6. <h3>B</h3>
  7. <ul>
  8. <li>Tytuły na B</li>
  9. ...
  10. </ul>
  11. <h3>C</h3>
  12. <ul>
  13. <li>Tytuły na C</li>
  14. ...
  15. </ul>
  16. <h3>D</h3>
  17. <ul>
  18. <li>Tytuły na D</li>
  19. ...
  20. </ul>


Czyli potrzebuję jakiegoś sposobu, by podczas wykonywania całej pętli "wyczuć" kiedy zaczyna się nowa litera i wtedy dodatkowo zrobić jakieś echo rodzaju:

  1. <?php
  2. echo '</ul><h3>'.$litera.'</h3><ul>'
  3. ?>


Robił ktoś coś takiego i ma gotowe rozwiązanie ? smile.gif
Go to the top of the page
+Quote Post
skowron-line
post 18.05.2009, 11:05:16
Post #2





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Może to Ci pomoże.
  1. <?php
  2. for ($i = a; $i!="aa" ; $i++) {
  3.   echo $i;
  4. }
  5. ?>

żywcem z manuala.


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
barat
post 18.05.2009, 11:18:10
Post #3





Grupa: Zarejestrowani
Postów: 183
Pomógł: 0
Dołączył: 19.05.2007

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


To chyba raczej nie załatwi sprawy ... może jaśniej ...

Podanym wcześniej zapytaniem pobieram listę artykułów w określonym zakresie liter. W rezultacie dostaję obiekt z tymi artykułami (używam Kohanaphp)
Taki obiekt z artykułami przekazuję do widoku.
Powiedzmy, że w obiekcie mam następujące artykuły:
  1. Artykuł o niczym
  2. Artykuł przykładowy
  3. Bardzo przykładowy artykuł
  4. Bardzo artykułowy artykuł
  5. Ciekawy artykuł
  6. Ciekawszy artykuł
  7. Dalszy artykuł
  8. Dobry artykuł
W widoku je "odbieram"

  1. <ul>
  2. <?php foreach($artykuly as $row ):?>
  3.    <li><a href="artykul,<?php echo $row->id.','.url::title($row->nazwa, '-'); ?>.html" title="<?php echo html::specialchars($row->nazwa); ?>"><?= $row->nazwa ?></a></li>
  4. <?php endforeach; ?>
  5. </ul>


Będą to nazwy tych artykułów posortowane alfabetycznie (jako linki w liście ul). Kwestia jest taka, że jak zaczyna się literka B, chciałbym jeden jedyny raz wstrzyknąć </ul><h3>B</h3><ul> , następnie to samo z literą C oraz D ...

Czyli pewnie potrzebowałbym czegoś w rodzaju sprawdzenia pierwszego wystąpienia danej litery na początku nazwy, walnięcia tej literki i uaktywnienia dopiero jak będzie pierwsze wystąpienie kolejnej litery ...

Prymitywnym rozwiązaniem mojego problemu byłoby użycie 4 osobnych zapytań do bazy i zrobienie 4 osobnych foreach z odpowiednimi tytułami (A, B,C, D) ... ale oczywiście alfabet jest długi, poza tym "na sztywno" nie jest dobrze bo przecież na daną literę wcale nie musi być artykułu ...

Ten post edytował barat 18.05.2009, 11:21:11
Go to the top of the page
+Quote Post
ndx
post 18.05.2009, 11:44:16
Post #4





Grupa: Zarejestrowani
Postów: 17
Pomógł: 6
Dołączył: 11.11.2005

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


  1. <ul>
  2. <?php foreach($artykuly as $row ):?>
  3. <?php if($last != mb_strtolower($row->nazwa[0])): ?>
  4. </ul><h3><?php echo mb_strtolower($row->nazwa[0]); ?></h3><ul>
  5. <?php endif; ?>
  6.   <li><a href="artykul,<?php echo $row->id.','.url::title($row->nazwa, '-'); ?>.html" title="<?php echo html::specialchars($row->nazwa); ?>"><?= $row->nazwa ?></a></li>
  7. <?php $last = mb_strtolower($row->nazwa[0]); ?>
  8. <?php endforeach; ?>
  9. </ul>


Ten post edytował ndx 18.05.2009, 11:49:38
Go to the top of the page
+Quote Post
barat
post 18.05.2009, 12:38:44
Post #5





Grupa: Zarejestrowani
Postów: 183
Pomógł: 0
Dołączył: 19.05.2007

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


O takie coś chodziło .. musiałem tylko odrobinkę poprawić:

<?php if(!isset($last) || $last != mb_strtolower($row->nazwa[0])): ?>

W kohana nie wolno się odnosić do nieistniejącej zmiennej (błąd) więc sprawdzam isset ... a dokładniej !isset - dzięki temu do pierwszego tytułu też na górze zostanie dopisana literka smile.gif

Dzięki smile.gif
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 18.07.2025 - 04:18