Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Jak skrócić pętle if
Forum PHP.pl > Forum > Przedszkole
stardar
Mam taki kod funkcji, który napisałem, do przekierowania, kiedy strona jest wywołana bez dodatkowych danych. Działa, ale chyba za mocno narąbałem "ifów". Czy ktoś doświadczony mógłby powiedzieć, czy się da i jak to skrócić?

  1. <?php
  2. function page_redirect() {
  3. $data = file_get_contents('http://'.$_SERVER['SERVER_NAME'].'/ps/categories/get');
  4. $json = json_decode($data);
  5.  
  6. foreach ($json as $category):
  7.  
  8. $category_id=$category->id;
  9. $category_last=$category->last_article->id;
  10. $article_id=$category->last_article->title;
  11. $redirect_link='?cat='.$category_id.'&id='.$category_last.'&page=1';
  12.  
  13. if (($category_id =='2') && ($_SERVER['REQUEST_URI'] == '/umx_rhythmix.php')&& (!isset($_GET['id']))) {
  14. header("Location: $redirect_link");
  15. }
  16. if (($category_id =='3') && ($_SERVER['REQUEST_URI'] == '/umx_wps.php')&& (!isset($_GET['id']))) {
  17. header("Location: $redirect_link");
  18. }
  19. if (($category_id =='4') && ($_SERVER['REQUEST_URI'] == '/blog.php')&& (!isset($_GET['id']))) {
  20. header("Location: $redirect_link");
  21. }
  22. if (($category_id =='5') && ($_SERVER['REQUEST_URI'] == '/umx_fss.php')&& (!isset($_GET['id']))) {
  23. header("Location: $redirect_link");
  24. }
  25. if (($category_id =='6') && ($_SERVER['REQUEST_URI'] == '/umx_akademia.php')&& (!isset($_GET['id']))) {
  26. header("Location: $redirect_link");
  27. }
  28. if (($category_id =='7') && ($_SERVER['REQUEST_URI'] == '/umx_historia.php')&& (!isset($_GET['id']))) {
  29. header("Location: $redirect_link");
  30. }
  31. if (($category_id =='8') && ($_SERVER['REQUEST_URI'] == '/umx_remixes.php')&& (!isset($_GET['id']))) {
  32. header("Location: $redirect_link");
  33. }
  34. if (($category_id =='9') && ($_SERVER['REQUEST_URI'] == '/txt.php')&& (!isset($_GET['id']))) {
  35. header("Location: $redirect_link");
  36. }
  37. if (($category_id =='11') && ($_SERVER['REQUEST_URI'] == '/projekty.php')&& (!isset($_GET['id']))) {
  38. header("Location: $redirect_link");
  39. }
  40. if (($category_id =='12') && ($_SERVER['REQUEST_URI'] == '/polpry.php')&& (!isset($_GET['id']))) {
  41. header("Location: $redirect_link");
  42. }
  43. if (($category_id =='13') && ($_SERVER['REQUEST_URI'] == '/cv.php')&& (!isset($_GET['id']))) {
  44. header("Location: $redirect_link");
  45. }
  46. if (($category_id =='14') && ($_SERVER['REQUEST_URI'] == '/dev.php')&& (!isset($_GET['id']))) {
  47. header("Location: $redirect_link");
  48. }
  49.  
  50. endforeach;
  51. }
  52.  
  53.  
  54. ?>


Dziękuję z góry.
Neutral
  1. <body style="background: darkgoldenrod;">
  2.  
  3. <?php
  4. $a = [2, 3, 4, 5];
  5. $b = ['umx1', 'umx2', 'umx3', 'umx4'];
  6.  
  7. $categories = [1, 2, 3, 0, 9];
  8.  
  9. foreach($categories as $category_id) {
  10. $randed = rand(0, 5);
  11. //echo "<span style='color: green;>";
  12. //var_dump((string)array_search($category_id, $a));
  13. //var_dump((string)array_search('umx'.$randed, $b));
  14. //echo "</span>";
  15. if(array_search($category_id, $a) === array_search('umx'.$randed, $b) /* && !isset($_GET['id']) */) {
  16. header("Location: " . '?categ='.$category_id);
  17. }
  18. }
  19.  
  20. ?>
  21.  
  22. </body>

Przełóż na swój kod.

Kolejność elementów w tablicy $a i $b jest bardzo ważna, ponieważ na tym bazuje funkcja array_search.
Cyfra 2 jest sprawdzana z 'umx1', dalej 3 z 'umx2', 4 z 'umx3', itd.
U Ciebie jest to
Kod
($category_id =='2') && ($_SERVER['REQUEST_URI'] == '/umx_rhythmix.php')
.
Porównujesz kategorię 2 z adresem '/umx_rhythmix.php', więc będzie to tak.
$a = [2, 3];
$b = ['/umx_rhythmix.php', '/umx_wps.php'];

Pamiętaj o tym, że === w ifie jest po to, żeby sprawdzać typ! Jeśli tego nie byłoby, to "" zostałoby porównane z 0 jako true, a tego nie chcemy. Poczytaj o tej funkcji.
Kod
if("" == 0)
,
Kod
if("" === 0)


Proszę, gotowe.
stardar
Bardzo Ci dziękuję!
SmokAnalog
Trzymanie powiązanych danych w osobnych strukturach prosi się o problemy, nie róbcie tak. Patrząc na ten kod nie wiadomo co jest z czym powiązane.

Zamiast polegać na kolejności wpisów w tablicy, lepiej je grupować, bo wtedy:

  • Kod jest znacznie bardziej czytelny
  • Dodawanie i usuwanie tych wpisów nie prosi się o błędy


Jeśli każde ID kategorii występuje tylko raz w tej logice, dobrym wyborem jest tablica mapująca ID kategorii na ścieżkę:

  1. $routes = [
  2. 2 => 'umx_rhythmix',
  3. 3 => 'umx_wps',
  4. 4 => 'blog',
  5. 5 => 'umx_fss',
  6. 6 => 'umx_akademia',
  7. 7 => 'umx_historia',
  8. 8 => 'umx_remixes',
  9. 9 => 'txt',
  10. 11 => 'projekty',
  11. 12 => 'polpry',
  12. 13 => 'cv',
  13. 14 => 'dev',
  14. ];


Ale i tak mam przeczucie, że coś dziwnie wymyśliłeś z tymi ID kategorii. Jeśli chcesz to uprościć, to napisz tu o co chodzi z tymi kategoriami, bo ilekroć w kodzie masz użyte rzeczywiste ID czegokolwiek, na 99% robisz to źle.
stardar
Może zacznę od tego, że nie jestem programistą, przez co wykazuję dużą trudność w poruszaniu się w językach programowania. Oczywiście potrafię napisać proste rzeczy, typu prosta instrukcja warunkowa if/else, ale na tym się moje umiejętności w tym zakresie kończą. Żeby jednak nie wyjść na totalną lamę, wspomnę tylko, że biegle znam język HTML4/5 i CSS 2/3. To już coś, nie? biggrin.gif

A teraz do rzeczy:

Mam panel do pisania tekstów napisany w PHP (na frameworku Laravel).

Panel zwraca tablicę JSON.

  1. array(15) {
  2. [0]=>
  3. object(stdClass)#1 (5) {
  4. ["id"]=>
  5. int(2)
  6. ["name"]=>
  7. string(8) "rhythmix"
  8. ["created_at"]=>
  9. string(27) "2020-07-17T18:52:52.000000Z"
  10. ["updated_at"]=>
  11. string(27) "2020-07-17T18:52:52.000000Z"
  12. ["last_article"]=>
  13. object(stdClass)#2 (9) {
  14. ["id"]=>
  15. int(15)
  16. ["title"]=>
  17. string(31) "Rhythmix AC 077 2016-12-09 H1T1"
  18. ["author"]=>
  19. string(19) "Dariusz S."
  20. ["description"]=>
  21. NULL
  22. ["content"]=>
  23. string(633) "<p>"Rhythmix AC" to miksowany program 4BO skonstruowany z największych przeboj&oacute;w POP, Dance &amp; R'N'B. Choć format czasem nawiązuje do aktualnych list przeboj&oacute;w, treść nie jest od nich w żaden spos&oacute;b zależna. Powiedzieć można, że "Rhythmix" prezentuje utwory powszechnie znane i lubiane, często w zremixowanych (r&oacute;wnież przez Ultramix) wersjach.</p>
  24. <p>Dystrybucja materiał&oacute;w odbywała się za pośrednictwem portalu "Mixcloud.com", a projekt zakończył życie 160. odcinkiem w 2018 roku.</p>
  25. <p>[media]https://www.mixcloud.com/ultramix/rhythmix-ac-77-2016-12-09-h1t1/[/media]</p>"
  26. ["is_active"]=>
  27. int(1)
  28. ["category_id"]=>
  29. int(2)
  30. ["created_at"]=>
  31. string(27) "2025-08-17T23:16:08.000000Z"
  32. ["updated_at"]=>
  33. string(27) "2020-08-06T20:52:19.000000Z"
  34. }
  35. }
  36. [1]=>
  37. object(stdClass)#3 (5) {
  38. ["id"]=>
  39. int(3)
  40. ["name"]=>
  41. string(3) "wps"
  42. ["created_at"]=>
  43. string(27) "2020-07-17T18:52:57.000000Z"
  44. ["updated_at"]=>
  45. string(27) "2020-07-17T18:52:57.000000Z"
  46. ["last_article"]=>
  47. object(stdClass)#4 (9) {
  48. ["id"]=>
  49. int(59)
  50. ["title"]=>
  51. string(41) "Weekly Party Show - ARP Edition - Demo #1"
  52. ["author"]=>
  53. string(19) "Dariusz S."
  54. ["description"]=>
  55. NULL
  56. ["content"]=>
  57. string(1151) "<p>"Weekly Party Show" to mixowany, "bezhostowy" program, kt&oacute;rym ograłem wiele radiowych stacji internetowych. Program wzorowany był na amerykańskim Hot Mix'ie, choć ze względu na specyfikę rynku, w pierwotnej konstrukcji i zawartości nieco r&oacute;żnił się od oryginału (nie opierał się sztywno na światowym topie; dopuszczał utwory polskich wykonawc&oacute;w). Swoje życie program zaczął w 1995 roku, kiedy tworzyłem go w elbląskim Radio Bis (pod nazwą "Dance Mix"). Wraz z rozwojem technologii, miksy tworzone w "analogowy" spos&oacute;b, wyparte zostały przez montaż komputerowy, co wpłynęło na jakość finalnego produktu.</p>
  58. <p>Program posiadał kilka "kr&oacute;tkich" wersji, m.in. profilowany muzycznie "Urban Mix" (z 10-odcinkową emisją w internetowym radio Hip Hop Polska), a także luźniejszą formatowo wersję "Live", graną gościnnie w r&oacute;żnych miejscach w internecie. Ostatnie emisje miały miejsce w internetowym radio OnAir!, a program zakończył swoje życie 709. odcinkiem specjalnym.</p>
  59. <p>[media]https://www.mixcloud.com/ultramix/weekly-party-show-arp-edition-demo-1/[/media]</p>"
  60. ["is_active"]=>
  61. int(1)
  62. ["category_id"]=>
  63. int(3)
  64. ["created_at"]=>
  65. string(27) "2025-08-18T23:26:58.000000Z"
  66. ["updated_at"]=>
  67. string(27) "2020-08-06T20:59:49.000000Z"
  68. }
  69. }



Wywołanie danych z kodu jest następujące:

  1. $data = file_get_contents('http://'.$_SERVER['SERVER_NAME'].'/ps/categories/get');
  2. $json = json_decode($data);


Tablica zwraca wartości m.in.:

  1. $category->id /* id istniejącej kategorii */
  2. $category->last_article->id /* id ostatniego napisanego artykułu w danej kategorii */


To działa idealnie, mogę wyświetlić dane instrukcją:

  1. foreach ($json as $category):
  2.  
  3. $category_id=$category->id;
  4. $category_last=$category->last_article->id;
  5. $article_id=$category->last_article->title;
  6. $redirect_link='?cat='.$category_id.'&id='.$category_last.'&page=1';
  7.  
  8. echo 'ID kategorii: '.$category_id;
  9. echo 'ID ostatniego artykułu w kategorii: '.$category_last;
  10. echo 'Link ostatniego artykułu w kategorii: '.$redirect_link;
  11.  
  12. endforeach;


$redirect_link potrzebny mi jest, żeby stronę wywołania bez podanych parametrów wyświetlania (np. blog.php?cat=4&id=256&page=1 zamiast blog.php) przekierować
na wartość określoną właśnie w $redirect_link, przy założeniu, że na jedna strona obsługuję jedną kategorię - np. blog.php - '4', txt.php -12.

Potrzebuję więc funkcji (do której require umieszczę w kodzie każdej ze stron), która wyciągnie właściwe dla siebie dane z funkcji (sprawdzi do jakiej strony wykonać przeładowanie, jeśli załadowana strona została wywołana bez parametru).

Nie potrafię chyba prościej tego opisać biggrin.gif
SmokAnalog
A czy ten panel jest odseparowany od tego, co chcesz zrobić? Innymi słowy, czy możesz go edytować czy chcesz napisać coś kompletnie odrębnego?

Bo wiesz, w takiej odrębności nie ma nic złego, tylko trzeba to zrobić tak, żeby po kilku tygodniach nie zrobił się bałagan. Przypisywanie na sucho w kodzie ID do czegoś jest kompletnie nieczytelne. Jeśli ta apka Laravelowa ma zostać niezmieniona, to może chociaż zrób sobie własny mini-panel do łączenia kategorii z tym, co potrzebujesz? Mógłbyś generować nawet zwykły plik JSON tym.

Ale najlepszym rozwiązaniem byłoby tak ukształtować ten panel, żeby spełniał Twoje potrzeby.
stardar
Panel ma odrębną, zamkniętą strukturę i swoje zadanie spełnia moim zdaniem bardzo dobrze.

Moim zadaniem jest stworzenie strony, która czyta dane wprowadzane w panelu i wyprowadzone na zewnątrz poprzez tablicę array. I z tym właśnie mam problem.

Dane są stałe, mają określoną strukturę, np. $category->last_article->title to id ostatniego posta w danej kategorii. Te dane sobie wyprowadziłem i działają dobrze.

Bardziej zaawansowane rzeczy, jak problem w obliczu którego stanąłem to dla mnie ciężka materia, walczę nad rozwiązaniem już 5 dzień. No ale jak się nie ma wystarczającej wiedzy... Dlatego zdecydowałem się poprosić o pomoc tutaj.
SmokAnalog
Jest jeszcze taki problem z Twoim skryptem, że czytasz $_SERVER['REQUEST_URI'], który zawiera też query string. Czyli jak dasz ?a=1 na końcu swojego URL-a, to już nie zadziała. Nie wiem, ja z zasady nie podejmuję się naprawiania kodu, z którym się nie zgadzam. Dziwne to, że używasz osobnych plików PHP i czytasz który to plik z $_SERVER['REQUEST_URI']. Lepiej byłoby to napisać od początku i przypuszczam, że te osobne pliki PHP to też jest kiepski pomysł.
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.