Jak przeksztalcic zagniezdzone petle do bardziej czytelnego kodu?

0

Witam,

Wiem, ze jest teraz moda na unikanie jak sie tylko da nested loop. I zgadzam sie z tym. Nie wyglda to dobrze. Przeszukalem google i znalazlem przyklady tj.:

[1] Ktos uzyl array_column oraz array_map. Niby spoko, ale przeciez obie te funcje wbudowane korzystaja z petli.

[2] Pozniej znalazlem przykald przy uzyciu metod. Czyli w moim przykladzie mam 3 petle. Wiec gosc stworzyl 3 metody i przeniosl pojedyncze petle do poszczegolnych method. Niby moze ta opcja jest delikatnie czytelniejsza, ale dalej jest oparta na 3 petlach, a mamy sie ich chyba wyzbyc?

[3] Kolejna rzecz, ktora znalazlem bylo napisanie swojego Iteratora, ale to juz chyba nawet za glebokie pojscie w las.

OK, jakie sa wasze pomysly? Moje 3 petle to nic innego jak 1 petla na firmy, 2 petla na zamowienia i 3 petla na produkty. Generalnie dostaje z zewnetrzengo API taka duza tablice i musze wszystkie te dane musze przypisac do obiektow oraz posortowac. Dlatego te 3 petle :)

0

a jak wygląda ta tablica i jk bardzo jest duża?

0

Nie jest duza. Z 10 firm, po 1-5 zamowien i w kazdym zamowieni po 1-4 produkty.
screenshot-20200804184227.png

Mega uproszczaja mam cos takiego:

<?php

$orderKey   = count($orders);
$productKey = count($products);

foreach ($data['results'] as $results) {
    foreach ($results['orders'] as $order) {
        $company            = [];
        $company['title']   = $results['name'];
        $company['created'] = $results['created_date'];

        $orderDate = new DateTimeImmutable($order['ordered']);

        $orders[$orderKey] = [
            'ordered'  => $orderDate->format('Y-m-d H:i:s'),
        ];

        $products[$productKey] = [
            'company' => $company,
        ];

        foreach ($order['order_items'] as $item) {
            $orders[$orderKey]['items'][] = [
                'quantity' => $item['qty'],
            ];

            $products[$productKey]['items'][] = [
                'ordered' => $orderDate,
            ];
        }

        $orderKey++;
        $productKey++;
    }
}

haha, no pisze, ze to wcale to nie taka prosta sprawa.

1

z tego screena wynika że chyba powinno być $results[0]['orders']
w jakim formacie dostajesz odpowiedź z tego API? XML

0

Fakt, mozna przerobic to na 2 petle $results[0]['orders']. API zwraca JSON'a.

1

możesz tę $company pętle wyżej tworzyć skoro jest taka sama dla wszystkich $results[0]. Zastanawiam się czy nie ma gotowych bibliotek do jsona którym można by podać do jakich obiektów mają to wczytać. W każdym razie jeśli po prostu przerabiasz plik tekstowy na obiekty jakie są Ci potrzebne to nie ma chyba sensu robić jakichś super optymalizacji, chyba że miałbyś wiele podobnych formatów i robiłbyś dla nich ogólny import

0

Niby tak, ale jak kiedys w przyszlosci bede mial podobny problem tylko, ze tablica bedzie znacznie wieksza? Ale ok, usune jedna petle i moze stworze 1-2 metody. Pobawie sie.

2

Dla czytelności i debugowania do mnie najbardziej przemawia opcja nr 2. Szczególnie jak tablica jest duża a klucze opisane z małym sensem.

1

zgadzam się z @jurek1980 że warto część wywalić do funkcji i jak nie musiz mieć tego na już to poeksperymentuj na dobry przykład do nauki to wygląda

3

Opcja nr 2.

  1. Nie da się pozbyć pętli całkowicie. Tak jak pisałeś, array_map itp., to tylko ta ładniejsza nakładka, która jednak jest wolniejsza od zwykłych pętli.
  2. Metody to dobra opcja. Kod robi się czytelniejszy, a dodatkowo niwelujesz liczbę zagnieżdżeń.
  3. Jeśli jest taka potrzeba, to możesz też skorzystać z bilioteki DS, która udostępnia dodatkowe struktury, które możesz użyć zamiast zwykłej tablicy. Powinny one trochę przyspieszyć różne działania na zbiorze danych. https://medium.com/@rtheunissen/efficient-data-structures-for-php-7-9dda7af674cd
2

W 9 na 10 sytuacjach stosuje metody z zakresu refaktoryzacjj i do metod + stosuję continue jeśli jest tak opcja. W przypadku PHP wszelkie callbacki z natury będą wolniejsze niż zwykłe pętle więc raczej ich nie stosuje - co do czytelności też dla mnie temat dyskusyjny. O ile w JS zapis jest całkiem zgrabny to w PHP trochę to obecnie słabo czytelne jest dla mnie - ma się poprawić w którejś kolejnej wersji PHP (albo już się poprawiło).
W każdym razie dla mnie podstawowa kwestia to czytelność kodu i to załatwiane jest refaktoryzacją. Inne rzeczy stosuje sporadycznie. Nigdy nie stosuje zagnieżdżeń pętli bez wydzielenia osobnych metod, podobnie nie stosuję zagnieżdżonych Ifów, nie stosuje else, switche zastępuje abstrakcjami, konstrukcje warunkowe z więcej niż 2 testami zastępuje zmienną/funkcją itp.

0

Rekurencja, albo zmienna refencyjna.

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