Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Wstawianie "liter" pomiędzy wyniki
Forum PHP.pl > Forum > PHP
barat
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
skowron-line
Może to Ci pomoże.
  1. <?php
  2. for ($i = a; $i!="aa" ; $i++) {
  3.   echo $i;
  4. }
  5. ?>

żywcem z manuala.
barat
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 ...
ndx
  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>
barat
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
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.