Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Jak skrócić pętle if
stardar
post 10.08.2020, 01:54:52
Post #1





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 9.08.2020

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


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.
Go to the top of the page
+Quote Post
Neutral
post 10.08.2020, 04:34:06
Post #2





Grupa: Zarejestrowani
Postów: 286
Pomógł: 46
Dołączył: 10.01.2016

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


  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.

Ten post edytował Neutral 10.08.2020, 04:38:27
Go to the top of the page
+Quote Post
stardar
post 10.08.2020, 10:02:56
Post #3





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 9.08.2020

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


Bardzo Ci dziękuję!
Go to the top of the page
+Quote Post
SmokAnalog
post 10.08.2020, 13:02:30
Post #4





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


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.

Ten post edytował SmokAnalog 10.08.2020, 13:03:39
Go to the top of the page
+Quote Post
stardar
post 10.08.2020, 15:39:06
Post #5





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 9.08.2020

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


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

Ten post edytował stardar 10.08.2020, 15:50:30
Go to the top of the page
+Quote Post
SmokAnalog
post 10.08.2020, 16:00:22
Post #6





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


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.
Go to the top of the page
+Quote Post
stardar
post 10.08.2020, 16:24:25
Post #7





Grupa: Zarejestrowani
Postów: 11
Pomógł: 0
Dołączył: 9.08.2020

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


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.
Go to the top of the page
+Quote Post
SmokAnalog
post 10.08.2020, 17:23:52
Post #8





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


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ł.
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: 25.04.2024 - 12:59