Sprawdzenie czy tablica zawiera tylko konkretne elementy

0

Witam,
pobrałam poprzez api allegro parametry kategorii do każdego produktu które mam jako stdClass Object asocjacyjne z zagnieżdżonymi tablicami zwykłymi oraz stdClass Object. Przykład poniżej (niepełny ze względu na ilość danych):

stdClass Object (
[parameters] => Array (
[0] => stdClass Object ( [id] => 11323 [name] => Stan [type] => dictionary [required] => 1 ) )  
[1] => stdClass Object ( [id] => 129369 [name] => Marka [type] => dictionary [required] =>  1 [dictionary] => Array ( [0] => stdClass Object ( [id] => 129369_506545 [value] => 12 Benefits [dependsOnValueIds] => Array ( ) ) [1] => stdClass Object ( [id] => 129369_513517 [value] => 3LAB [dependsOnValueIds] => (....)Array ( ) ) 
[3] => stdClass Object ( [id] => 15604 [name] => Rodzaj rzęs [type] => dictionary [required] => 1) 
[4] => stdClass Object ( [id] => 130250 [name] => Typ [type] => dictionary [required] => 1
)  

Chciałam się dowiedzieć w jaki sposób mogę wyfiltrować obiekt by jeśli zawiera tylko parametry wymagane [required] = 1, stan i marka to mają zostać wyświetlone ich identyfikatory, w przeciwnym wypadku należy przejść do kolejnego produktu. Czyli jeśli kategoria produktu zawiera parametry tak jak w powyższym przykładzie to powinien zostać pominięty ponieważ oprócz stanu i marki zawiera również rodzaj rzęs i typ.
W jaki sposób mogę to zrobić ?

$allegroCategoryParameters = "https://api.allegro.pl.allegrosandbox.pl/sale/categories/" . $allegroCategoryId . "/parameters";
            $parametersCategory = $this->api->getParameters($allegroCategoryParameters);
            $parametersCategory = json_decode($parametersCategory);
            
            foreach ($parametersCategory->parameters as $allegroParameters)
            {
                if ($allegroParameters->required == 1 && in_array($allegroParameters->name == 'Marka', $parametersCategory->parameters) && in_array($allegroParameters->name == 'Stan', $parametersCategory->parameters))
                {
                    echo "<b>Produkt: $i</b>";
                    echo '</br>';
                    echo '</br>Wymagane parametry Allegro</br>';
                    print_r($allegroParameters->name);
                    echo '</br>';

                                        
                }
                else
                {
                    continue;
                }
             }
2

To już któreś, które widzę że zadajaesz, i związane jest tym samym problemem u Ciebie.

W Twoich aplikacjach wszystko jest rzucone w jedno miejsce. Logika biznesowa (required == 1), consty (https://api.allegro.pl.allegrosandbox.pl/sale/categories/), API, prezentacja i widok. Dlatego ciężko Ci edytować Twoje aplikacje później.

To co powinnaś zrobić to najpierw pobrać dane z API i zaprezentować je w najprostszej formie możliwej (w PHP to najpewniej będzie array). Potem powinnaś przekazać ten array do część domenowej, i tam powinny przejść wszystkie transformacje, np filtrowanie tego required == 1. Na samym końcu dane powinny być przekazane do prezentacji, gdzie są wyświetlane w widoku (lub w innej formie interfejsu użytkownia).

Takie podejście wymaga więcej dyscypliny, ale opłaca się na dłuższą metę.

Dwie rady na początek:

  • stdClass w PHP ssie strasznie, prawie nic się nie da na nim zrobić, oprócz rzutować na array. Z tego powodu nie używaj json_decode($parametersCategory);, tylko json_decode($parametersCategory, true); - to zwróci array.
  • Po drugie, pamiętaj że tablice które dostajesz od PHP albo z API albo od allegro, to jest jakby jedna część. Możesz tworzyć swoje tablice i swoje struktury danych, i to jest to co powinnaś robić. Widzę żę u Ciebie, jak masz array, to pierwsze co z nim robisz to go wyświetlasz. To jest w miarę okej, jeśli nie przeprowadzasz na nim transformacji. Jeśli chcesz wyfiltrować taki array, dodać jakiś if. To to już jest zła droga. Powinnaś:
  • Wciąć array $a, i wyfiltrować z niego dane do innego arraya $b.
  • Wyświetlić tylko array $b.

A po drugie, taka rada na początek, nie wklejaj kodu z print_r() albo z var_dump(), bo taki wkleiłeś w pierwszym poście. Wklej JSON. I pamiętaj żeby go otoczyć znacznikami formatującymi kod, bo nie da się tego czytać.

2

Inaczej, czy nie możesz tego wyfiltrować na poziomie API? Zobacz dokumentację i czy nie ma tam czegoś by zamiast pytać o wszytko w parametrach GET przesłać coś Ala

https://api.allegro.pl.allegrosandbox.pl/sale/categories/?stan=1123
0

@jurek1980: Przeglądałam dokumentację API, ale nie znalazłam takiej możliwości. Można tylko pobrać wszystkie parametry wg danej kategorii
@TomRiddle: Bardzo dziękuję za pomoc

0
kasia13130 napisał(a):

@jurek1980: Przeglądałam dokumentację API, ale nie znalazłam takiej możliwości. Można tylko pobrać wszystkie parametry wg danej kategorii

Pokaż dane które dostałeś w JSON. Coś wymyślimy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1