Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ [PHP]Pętla foreach i for

Napisany przez: Owneds 10.10.2019, 09:33:13

Witam serdecznie.

Mam mały problem z kodem.
Obecnie wygląda to tak, że dodaje np 10 osób w liście (z bazy) i obok każdej osoby jest licznik kliknięć.
Chciałbym to spreparować tak, aby u góry zaczynała się największa liczba a na dole najmniejsza.
mam na myśli:
Skrócony kod:

  1. public http://www.php.net/static function tablelist_front($post_id = false, $typec = false, $box_id = false){
  2. if(doo_here_type_links($post_id, $typec) == true){
  3. http://www.php.net/global $wpdb;
  4. $sql = "SELECT ID, post_author FROM $wpdb->posts ";
  5. $sql .= "WHERE post_parent = '$post_id' AND post_type = 'dt_gracze' AND post_status = 'publish' ";
  6. $sql .= "ORDER BY ID DESC ";
  7. $results = $wpdb->get_results($sql);
  8. if($results){
  9. $out = "<div id='{$box_id}' class='sbox'>";
  10. $out .= "<div class='links_table'><div class='fix-table'>";
  11. $out .= "<table><thead><tr>";
  12. $out .= "<th>Osoby</th>";
  13. if(doo_is_true('linksrowshow','cli') == true) $out .= "<th>".__d('Odsłon')."</th>";
  14. if(is_user_logged_in() && !current_user_can('subscriber'))
  15. $out .= "<th>".__d('Zarządzaj')."</th>";
  16. $out .= "</tr></thead><tbody>";
  17. foreach($results as $post){
  18. $psid = $post->ID;
  19. $type = get_post_meta($psid, '_dool_type', true);
  20. $clik = get_post_meta($psid, 'dt_views_count', true);
  21. $link = get_permalink($psid);
  22. $clik = ($clik) ? $clik : '0';
  23. $doma = ($type == __d('Gracze')) ? doo_compose_domainname('') : doo_compose_domainname($murl);
  24. $ltxt = ($type == __d('Gracze')) ? __d('Gracze') : $typec;
  25. $ulnk = get_author_posts_url($post->post_author);
  26. $fico = DOO_GICO.$doma;
  27. $domn = ($type == __d('Gracze')) ? 'Gracze' : doo_compose_domainname($murl);
  28. $edit = '<a href="#" class="edit_link" data-id="'.$psid.'">'.__d('Edit').'</a>';
  29. $delt = '<a href="#" class="delt_link" data-id="'.$psid.'">'.__d('Delete').'</a>';
  30.  
  31. if($type == $typec){
  32.  
  33. $out .= "<tr id='link-{$psid}'>";
  34. $out .= "<td><img src='{$fico}'> <a href='{$link}' target='_blank'>{$domn}</a></td>";
  35. if(doo_is_true('linksrowshow','cli') == true) $out .= "<td>{$clik}</td>";
  36. if(is_user_logged_in() && !current_user_can('subscriber'))
  37. $out .= "<td>{$edit} / {$delt}</td>";
  38. $out .= "</tr>";
  39. }
  40. }
  41. $out .= "</tbody></table></div></div></div>";
  42. }
  43. http://www.php.net/echo $out;
  44. }
  45. }


Próbowałem to dodać tak, ale cała pętla wykonuje się w jednej lini:
  1. $out .= "<tr id='link-{$psid}'>";
  2. $out .= "<td><img src='{$fico}'> <a href='{$link}' target='_blank'>{$domn}</a></td>";
  3. for($i = 0; $i <= 6; $i++)
  4. {
  5. if(doo_is_true('linksrowshow','cli') == true) $out .= "<td>{$i}</td>";
  6. }



A chciałbym aby wyglądało to tak:



Tylko nie wiem w którym miejscu dodać pętle aby jej wartość załadowywała się do każdej osoby osobno. Bo teraz jak sadze to jest tak, że dochodzi do każdej osoby, wykonuję petle od 6 do 2 i leci z następną osobą i znów to samo.

Pozdrawiam

Napisany przez: kapslokk 10.10.2019, 10:11:59

Na wstępie zaznaczę, że nigdy nie kodowałem nic w wordpressie, więc mogę nie mieć racji smile.gif

Generalnie zazwyczaj robi się tak, że pobiera się od razu wszystkie dane, które są potrzebne i w zapytaniu od razu się odpowiednio je sortuje. Ty pobierasz tylko ID i post_author, sortujesz to po ID i później dociągasz wszystkie inne dane - to negatywnie wpływa na wydajność skryptu. Wg. mnie powinieneś pobrać w jednym zapytaniu wszystkie dane, których potrzebujesz, posortować je w tym samym zapytaniu po ilości odsłon, a później w pętli tylko wyświetlić.

Napisany przez: Owneds 10.10.2019, 10:57:08

Serdecznie dziękuje za odpowiedź.

W wordpressie również dopiero zaczynam i jest to dość zaawansowana wtyczka którą staram się przerobić w miarę możliwości pod siebie i do efektu finalnego brakuje mi tylko tej pętli.
Generalnie nie chodzi nawet o to żeby to sortowało w bazie po ilości kliknięć, tylko aby było to nawet spreparowane, że nie zależnie jaka jest osoba u góry, po prostu od góry ma pokazywać największa liczbę kliknięć a na dole najmniejszą, zgodnie z liczbami które znajdują się w pętli smile.gif. To już by mnie zadowoliło smile.gif Tylko, że nie wiem gdzie dodać tę pętlę aby było tak jak na screenie drugim a nie tak jak teraz, że pętla wykonuje się do każdego zapytania osobno.


Pozdrawiam

Napisany przez: kapslokk 11.10.2019, 06:55:48

No ale to juz przy wyciąganiu z bazy powinieneś to posortować. Wyobraź sobie, że masz tam kilka stron tych osób, wchodzisz na pierwszą, największa ilość kliknięć na tej stronie to 5, więc osoba z tą ilością jest na 1 miejscu, wchodzisz na stronę drugą a tam 10000. To troche nie logiczne, nie uważasz? Zamiast

  1. $sql .= "ORDER BY ID DESC ";
zrób po prostu order by ILOSC_KLIKNIEC DESC. Zamiast ILOSC_KLIKNIEC musisz wstawic pole, w którym jest to przechowywane.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)