Odwracanie tablicy w PHP
W jednym z projektów potrzebowaliśmy importu dokumentów Excela do naszej bazy danych. Zadanie proste, łatwe i przyjemne, korzystamy z gotowej biblioteki , otwieramy plik i importujemy wiersz po wierszu. Tak wygląda pierwszy element tablica w PHP.
Tu właśnie pojawił się problem – z pewnych względów klientowi najłatwiej było zapisywać dane kolumnami – czyli jeden pełen zestaw danych to kolumna A, potem B, C itd. Biblioteka nie posiadała metod do czytania pliku kolumnami, trzeba było dokonać operacji odwrócenia danych.
Matematycznie rzec biorąc, wymagana operacja to transpozycja tablicy. Na szczęście danych było na tyle mało że pełen zestaw mieścił się bez problemu w pamięci operacyjnej serwera. Zacząłem pisać własne rozwiązanie, ale z każdą kolejną linią zagnieżdzonych pętli czułem że da się lepiej. Poszukałem i znalazłem rozwiązanie które na pierwszy rzut oka nie ma prawa działać – spójrzcie sami:
array_map(null, ...$array)
O dziwo działa, ale jak?
Niech nasza tablica będzie zawierać zwyczajowe nazwy komórek z akrusza kalkulacyjnego:
$array = [
[A1, B1, C1, D1, E1],
[A2, B2, C2, D2, E2],
[A3, B3, C3, D3, E3],
];
Zacznijmy od końca:
...$array
Zgodnie z dokumentacją taka konstrukcja przy podawaniu argumentów powoduje odpakowanie tablicy tak że każdy jej element stanie się argumentem. Mając tą wiedzę, rozpiszmy nasz kod:
array_map(
null,
[A1, B1, C1, D1, E1],
[A2, B2, C2, D2, E2],
[A3, B3, C3, D3, E3]
);
Podanie null
jako callback do array_map
, według dokumentacji powoduje zbudowanie tablicy tablic w ten sposób że pierwszy element będzie tablicą pierwszych elementów, drugi tablicą drugich elementów i tak dalej. W związku z tym, wynik będzie wyglądać następująco:
[
[A1, A2, A3],
[B2, B2, B3],
[C1, C2, C3],
[D1, D2, D3],
[E1, E2, E3],
];
Co dokładnie odpowiada początkowej tablicy po transpozycji – kolumny są teraz wierszami które łatwo można zapisać do bazy danych.
No i mamy to – tablica w php gotowa.