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

Wyświetlanie tylko jednego echa w pętli

Object Storage Arubacloud
0 głosów
195 wizyt
pytanie zadane 31 sierpnia 2017 w PHP przez sc4rface Dyskutant (7,710 p.)

Cześć, zamieszczam swój fragment kodu, z którym mam mały problem. 

$result = array();

            foreach ($products as $detail) {
                
                $cid = $detail['category_id'];
                $pid = $detail['product_id'];
                $status = $detail['active'];
                $result[$cid][$pid] = $status;

            }
            
            $multiplier = $result[$cid][$pid];
            $counter = count($result[$cid]);
            $multiplier2 = 1;
            
            for ($id = 0; $id < $counter; $id++) {
                $multiplier = $multiplier * $multiplier2;
            }
                                     
            if ($multiplier == 0) {
                echo 'Kategoria ID '.$cid.' pusta';
            } else {
                echo 'Kategoria ID '.$cid.' zawiera produkty';
            }

Generuje on następującą tablice:

Array
(
    [221] => Array
        (
            [1] => 0
            [2] => 0
        )

    [1437] => Array
        (
            [3] => 0
        )

)

Wszystko byłoby spoko, gdyby nie fakt - że wyświetla tylko jedno echo - mianowicie ostatni rekord tablicy. Działa to na tej zasadzie, że skrypt pobiera wartości [1][2][3] i tak dalej (nie sa one po kolei, tutaj tak się złożyło) i mnoży je przez siebie w odpowiednim ID nadrzędnym. Jeśli wynik mnożenia jest > 0 wyświetla "kategoria zawiera produkty" jeżeli nie, pusta. Problem w tym, że wyświetla tylko jedno echo - a na przykładzie tej tablicy, powinien wyświetlić ich dwa - mianowicie 2x "kategoria jest pusta". Jak mogę to naprawić?

1 odpowiedź

+2 głosów
odpowiedź 31 sierpnia 2017 przez Ehlert Ekspert (212,670 p.)
Kod jest strasznie nieczytelny. Jest to fragment kodu, więc nie wiem jakie dane przetwarzasz i po co robisz to w taki sposób. Proponuję dołączenie reszty, lub skorzystanie z IDE + Xdebuga. Na ten moment nawet, gdybym chciał Ci pomóc jestem wybity z kontekstu.
komentarz 31 sierpnia 2017 przez sc4rface Dyskutant (7,710 p.)
Reszta kodu to zapytanie do bazy + połączenie z nią, więc sens wrzucania czegokolwiek więcej jak dla mnie nie istnieje.

$pid - id produktu

$cid - id categorii

$status - znacznik aktywności produktu

Wszystkie zmienne pobierane są z bazy przez PDO, dzięki czemu tworzą tablice, które doprowadziłem do takiej postaci jak wrzuciłem w temacie.

Co do nieczytelności kodu, jestem tego świadom - dopiero się uczę.
komentarz 31 sierpnia 2017 przez Boshi VIP (100,240 p.)
  if ($multiplier == 0) {
                echo 'Kategoria ID '.$cid.' pusta';
            } else {
                echo 'Kategoria ID '.$cid.' zawiera produkty';
            }

 

nie wiem czy to to w ogóle wyświetla co chcesz, ale przecież to nie jest w pętli?  więc dlaczego miało by się w ogóle (bez znaczenia z jakiej przyczyny) wyświetlać x  tego?

 

po za tym jak napisał Ehlert, nie bardzo wiadomo o co chodzi. Za duży kontekst

komentarz 31 sierpnia 2017 przez sc4rface Dyskutant (7,710 p.)

Wsadziłem to do pętli, ale teraz pętla idzie po kolei po każdym rekordzie i dubluje kategorie w ten sposób, że:

[221][1]

[221][2]

[1437][3]

I za każdym razem echuje w zależności od znacznika aktywności. A chciałbym wykonać to tak, że dopiero po przemnożeniu wszystkich wartości id produktów, jeżeli wynik mnożenia jest mniejsza od 0 wyświetla coś.

Najlepiej pokaże to wynik działania skryptu, w formie obrazka - bo mam tendencję do chaotycznego uzewnętrzniania tego co mi w głowie siedzi.

komentarz 31 sierpnia 2017 przez Ehlert Ekspert (212,670 p.)
  1. Jestem w stanie się założyć, że schemat Twojej tabeli jest napisany nieodpowiednio, brakuje normalizacji.
  2. Zupełnie nie rozumiem po co taka logika. To, że coś nie ma kategorii lub jest ona pusta można praktycznie bezpośrednio wyciągnąć z dobrze zaprojektowanego schematu po stronie bazy danych.
  3. Nie rozumiem dlaczego mieszasz operacje logiczne z echem i innymi takimi. Co jeśli w pewnym momencie analizowania sytuacji logicznej coś rzuci Exception, a Ty będziesz mieć pół strony zechowane?
  4. Gdybyś korzystał z IDE + Xdebug nie byłoby pytań.
komentarz 31 sierpnia 2017 przez Boshi VIP (100,240 p.)
Daje sobię uciąć palec, że to co kombinujesz jest banalne do zrobienia, ale raz

w inny sposób

dwa nie pojmujemy twojego toku myślenia dlatego ciezko będzie pomóc.

Powiedz co dokładnie chcesz osiągnąć. Inaczej możę być  kiepsko z pomoca ;p
komentarz 31 sierpnia 2017 przez sc4rface Dyskutant (7,710 p.)
W skrócie - chcę pobrać z bazy id produktu, kategorię, znacznik aktywności

I w zależności, jeżeli któryś z produktów w kategorii jest aktywny (wystarczy jeden) echuje informacje, że cała kategoria aktywna. W innym wypadku - kategoria pusta.
2
komentarz 31 sierpnia 2017 przez Ehlert Ekspert (212,670 p.)
Więc po co wyciągasz wszystko? Wyciągnij to, co ma kategorię, która Cię interesuje oraz te, które są aktywne. Jeśli wyjdzie z bazy cokolwiek: kategoria aktywna. I żadnego mnożenia.
komentarz 31 sierpnia 2017 przez sc4rface Dyskutant (7,710 p.)
Drugi raz łapię się na tym, że komplikuję sobie życie. Ostatnio również pytałem o rozwiązanie łączenia trzech tablic w jedną i jej sformatowanie, a okazało się, że spokojnie mogłem wykonać wszystko jednym zapytaniem do bazy...
2
komentarz 31 sierpnia 2017 przez Boshi VIP (100,240 p.)
Z zasady baza powinna być tak zaprojektowana abyś nie musiał w phpie bawić się w operacje logiczne na tablicach. Wyciągasz z bazy to co potrzebujesz, wstawiasz ewentualnie jakiś warunek na podstawie tychże danych i wtedy masz jasność :)
komentarz 31 sierpnia 2017 przez sc4rface Dyskutant (7,710 p.)
edycja 31 sierpnia 2017 przez sc4rface

No dobra, teraz mój kod drastycznie się zmienił :D Zawiera 3 linijki? Tak czy inaczej dalej coś nie gra, bowiem dalej te kategorie się dublują. 

foreach ($products as $detail) {

echo 'Pusta kategoria: ' .$detail['category_id']. '<br />'; 
                
}

Totalnie nie wiem co jest tutaj powodem, tablica $products wygląda w ten sposób:

Array
(
    [0] => Array
        (
            [product_id] => 1
            [0] => 1
            [category_id] => 221
            [1] => 221
            [active] => 0
            [2] => 0
        )

    [1] => Array
        (
            [product_id] => 2
            [0] => 2
            [category_id] => 221
            [1] => 221
            [active] => 0
            [2] => 0
        )

    [2] => Array
        (
            [product_id] => 3
            [0] => 3
            [category_id] => 1437
            [1] => 1437
            [active] => 0
            [2] => 0
        )

    [3] => Array
        (
            [product_id] => 4
            [0] => 4
            [category_id] => 1437
            [1] => 1437
            [active] => 0
            [2] => 0
        )

    [4] => Array
        (
            [product_id] => 5
            [0] => 5
            [category_id] => 216
            [1] => 216
            [active] => 0
            [2] => 0
        )

)

 

@EDIT

Tak sobie to przemyślałem i w jaki sposób miałoby to działać, active nie jest znacznikiem kategorii, a produktu. Działa to w ten sposób, że jeśli żadne produkty w kategorii nie są aktywne - wtedy kategoria nie jest aktywna. Jeśli choć jeden jest aktywny, jest aktywna. Istnieje możliwość zapisania tego w czystym SQL'u, nie wydaje mi się.

komentarz 31 sierpnia 2017 przez Ehlert Ekspert (212,670 p.)
Istnieje. Ale masz źle zaprojektowaną bazę danych.
komentarz 31 sierpnia 2017 przez sc4rface Dyskutant (7,710 p.)
Da radę to jakoś obejść? Przeprojektowanie bazy odpada - nie ja ją tworzyłem, tym bardziej jest na to zbyt obszerna.

Podobne pytania

+1 głos
1 odpowiedź 197 wizyt
0 głosów
2 odpowiedzi 943 wizyt
0 głosów
1 odpowiedź 560 wizyt
pytanie zadane 12 września 2017 w JavaScript przez kevin Mądrala (5,010 p.)

92,555 zapytań

141,402 odpowiedzi

319,544 komentarzy

61,939 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!

...