• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Bład w pętli foreach

Object Storage Arubacloud
0 głosów
203 wizyt
pytanie zadane 26 lutego 2023 w PHP przez ayo1001 Obywatel (1,890 p.)

Cześć,

Mam pętle:

                            <?
                            foreach ($terms as $term) {
                                $string = $term->term_id . ' ';
                                if (strpos($string , '29') !== false) {
                                    echo 'style="display: block"';
                                } else {
                                    echo 'style="display: none"';
                                }
                            }
                            ?>

string przykładowo ma: "29 30 33 55 14"

jeżeli string na pierwszym miejscu ma 29 to kod działa poprawnie, ale jeżeli string ma np.  "30 33 29 55 14" to wyświetla display: none;

Jak zrobić, żeby szukało w całym stringu 29 i jeżeli nie znajdzie to dopiero wyświetla display: none

2 odpowiedzi

+1 głos
odpowiedź 26 lutego 2023 przez Arkadiusz Waluk Ekspert (287,950 p.)
W term_id w każdym przejściu jest tylko jedna liczba? Bo zgaduję, że błąd możesz mieć w linii 3 - chciałeś dodawać kolejną liczbę do $string, a wg kodu ta zmienna zawsze jest nadpisywana i przy każdym przejściu ląduje w niej tylko ostatnie term_id i spacja. Ponadto jeśli chcesz szukać w całym $string, a ten powinien być faktycznie "sklejany" w linii 3, to if w pętli nie ma sensu - można ten warunek zrobić za pętlą, aby sprawdzić czy w $string taka wartość się faktycznie znalazła czy nie.

Nie wiem też do końca co robisz, ale jeśli to ma być sposób na sprawdzenie czy coś o id 29 występuje w rekordach pobranych np. z bazy, to łatwo zauważyć, że w pewnym momencie może się jako term_id pojawić liczba 291 albo 129 i Twój warunek się nadal spełni, gdy tak naprawdę może to być niezamierzone. Jeśli to chcesz osiągnąć to należałoby to sprawdzać inaczej.
komentarz 26 lutego 2023 przez ayo1001 Obywatel (1,890 p.)
Może inaczej, liczba to kategoria. Muszę sprawdzić czy w ciągu term jest dana liczba, jeżeli tak to wyświetla display: block jeżeli nie zawiera to display: none;
komentarz 26 lutego 2023 przez Arkadiusz Waluk Ekspert (287,950 p.)
Rozumiem, ale to jak wyżej - pytanie co jest w $term->term_id (pojedyncza liczba czy kilka) i czy efekt ma być jeden na końcu czy dla każdego $term. Jeżeli tam np. w pierwszym $term jest wartość 30 to w pierwszym przejściu pętli ustawi się $string jako 30 i spacja. Natomiast przy drugim przejściu jeśli term_id będzie 33 to $string zostanie zamienione na 33 i spacja. Nie zostanie to dopisane do 30, które już było, tylko wartość zostanie nadpisana. Jeżeli $string powinien być ciągiem wszystkich term_id to powinieneś dopisywać (np. .= a nie =) a nie nadpisywać. Ponadto jeśli ten warunek z wyświetleniem style ma się wykonać raz, to należałoby go wyciągnąć za pętlę, wtedy gdy już cały $string będzie zbudowany.

No chyba, że $term->term_id od razu zawiera kilka liczb i warunek z style powinien się wykonać dla każdego $term. Wtedy powinno zadziałać tak jak masz, jeśli tak się nie dzieje to warto sprawdzić co jest w $string na każdym przejściu pętli najprościej choćby przez jakieś var_dump() albo echo, bo może wcale tam nie ma jednak wszystkich liczb, które być powinny. Sam warunek z strpos wygląda ok.
komentarz 26 lutego 2023 przez ayo1001 Obywatel (1,890 p.)
                        <?php while ($loop->have_posts()) : $loop->the_post(); ?>
                            <?php
                            $terms = wp_get_post_terms(get_the_ID(), array('kat1', 'kat2', 'kat3', 'kat4', 'kat5'));
                            ?>
                            <a 
                            <?
                            foreach ($terms as $term) {
                                $string = $term->term_id . '';
                                echo $string;
                                if (strpos($string , '29') !== false) {
                                    echo 'style="display: block"';
                                } else {
                                    echo 'style="display: none"';
                                }
                            }
                            ?>

Każdy array kat1, kat2 ma kilka kategorii.

Jak to wygląda w kodzie:

https://prnt.sc/96rT8pLx5KdK

 

 

1
komentarz 26 lutego 2023 przez Arkadiusz Waluk Ekspert (287,950 p.)
No więc $term->term_id to jednak pojedyncze id. Zobacz na zrzut, który wstawiłeś - każda linia zaczyna się od <a, później jest jedno id (które wyświetlane jest przez echo z linii 9), następnie dopisuje style na jego podstawie (czyli linia 11/13 w tym samym przejściu pętli) i dopiero za tym style są kolejne id, czyli pętla znów wróciła do linii 9. Jak dla mnie to jest ten problem, który opisałem na początku - jeśli chcesz tak zrobić, to w linii 8 musisz mieć dopisanie do stringa a nie nadpisanie, czyli .= zamiast =

Dodatkowo zmienną $string wypadałoby zainicjować i jednocześnie wyzerować dla każdego posta, a więc przed pętlą foreach, np. w linii 6. No i ifa, który wyświetli display block lub none należałoby zrobić za pętlą foreach, gdy cały $string będzie już zbudowany, czyli będzie zawierał już dodane wszystkie term_id.

Możesz sobie tak to zrobić i zobaczyć czy zadziała. Należy jednak pamiętać, że w takiej sytuacji nadal jest problem jeśli term id to będzie 129 albo 291 - gdy 29 będzie częścią innej liczby. Ja bym więc nie dopisywał tych id do jednego stringa, a zamiast tego dodawał np. do jakiejś tablicy i sprawdzał czy dane id w niej istnieje. Ewentualnie zamiast tego foreach można spróbować np. array_map().
1
komentarz 26 lutego 2023 przez ayo1001 Obywatel (1,890 p.)
Działa, dzięki wielkie za pomoc!
+1 głos
odpowiedź 26 lutego 2023 przez VBService Ekspert (253,420 p.)

Muszę sprawdzić czy w ciągu term jest dana liczba

proponuję użyć preg_match

[ on-line ]

$dana_liczba = 29;

foreach ($terms as $term)
    echo 'style="display: ' . ((preg_match('/\b'.$dana_liczba.'\b/', $term)) ? 'block':'none') . '"';

 

komentarz 26 lutego 2023 przez Arkadiusz Waluk Ekspert (287,950 p.)
A co złego w strpos(), które pytający już ma w swoim kodzie, w kontekście danego problemu? Chodzi tylko o to, aby zabezpieczyć się przed liczbami, które mogą mieć w sobie dany numer?

Podobne pytania

0 głosów
2 odpowiedzi 96 wizyt
pytanie zadane 11 grudnia 2022 w PHP przez lewur Początkujący (470 p.)
0 głosów
1 odpowiedź 279 wizyt
pytanie zadane 22 września 2022 w PHP przez NoteDS Użytkownik (560 p.)
0 głosów
1 odpowiedź 812 wizyt
pytanie zadane 11 maja 2020 w PHP przez Bakkit Dyskutant (7,600 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...