Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Inicjalizacja tablicy dwuwymiarowej
Forum PHP.pl > Forum > Przedszkole
Demoneos
Mam dwuwymiarową tablicę, która będzie przechowywała liczby. Przy jej tworzeniu tablica nie będzie miała żadnych elementów oraz nie znam rozmiarów tej tablicy. Tablica będzie po prostu uzupełniania w trakcie działania programu. I teraz chodzi mi o to, żeby każdy element tej tablicy miał wartość początkową 1. Np. gdy w trakcie programu wpiszę do elementu tablicy:
  1. $tablica[6][4]++;

to ten element będzie miała wartość nie 1, a 2. Czy da się jakoś to zrobić?
wookieb
Jeżeli nie znasz rozmiary tablicy to nie ma innej opcji niż po prostu sprawdzanie czy taki klucz istnieje isset i jeżeli to nie to uzupełnić jego wartość liczbą 1.
Gdybyś znał rozmiar tablic mógłbyś bawić się funkcją array_fill
flashdev
Cytat(wookieb @ 15.08.2010, 21:43:27 ) *
Jeżeli nie znasz rozmiary tablicy to nie ma innej opcji niż po prostu sprawdzanie czy taki klucz istnieje isset i jeżeli to nie to uzupełnić jego wartość liczbą 1.
Gdybyś znał rozmiar tablic mógłbyś bawić się funkcją array_fill


Ale można też napisać sobie prostą klasę, która obsłuży zapis/odczyt do takiej tablicy.
Wtedy nie znając jej rozmiaru można mimo wszystko mieć domyślnie wartość 1 w każdej komórce.
wookieb
Zbyt mały pierd aby angażować całą klasę.
thek
Tak... Da się. Nie jest to trudne. Musisz tylko pamiętać o jednym... Wywołanie $tablica[6][4] utworzy takie pole, ale tylko je. Nie utworzy natomiast tych przed nim będących i musisz je uzupełnić ręcznie. Jeśli te pola tylko inkrementujesz to dam Ci prostą funkcję, która to zrobi winksmiley.jpg
  1. <?php
  2. function increment( &$tab, $x, $y) {
  3. if( !isset( $tab[$x][$y] ) || $tab[$x][$y] == 0 )
  4. $tab[$x][$y] = 2;
  5. else
  6. $tab[$x][$y]++;
  7. }
  8.  
  9. $tablica = array();
  10. increment($tablica, 6, 4);
  11. increment($tablica, 5, 5);
  12. increment($tablica, 6, 2);
  13. increment($tablica, 6, 2);
  14. increment($tablica, 6, 1);
  15. increment($tablica, 5, 5);
  16. increment($tablica, 2, 8);
  17. ?>
  18. <pre>
  19. <?php
  20. print_r($tablica);
  21. ?>
  22. </pre>
Zauważ jak wygląda wyprintowana tablica... Musisz uzupełnić tylko luki zanim przejdziesz do następnych etapów gdzie owa tablica jest potrzebna. Powiem tylko, że napisanie funkcji, która to zrobi jest bardzo proste i dla porównania jeśli pierwsza wpisująca ma 4 linijki "pracujące", to wypełniająca ma w moim wykonaniu 14, w tym dwie pierwsze to inicjalizacja zmiennych do wartości 0, bo muszę wykryć faktyczny rozmiar tablicy wynikowej i za to odpowiada kolejne 6 linijek. Pozostałe to wykrywanie czy pole w zadanym indeksie X,Y jest już zainicjowane czymś, czy nie smile.gif
wookieb
@THEK zrób jeszcze wersję z array_fillem to osobiście przypnę Ci etykiętkę nabijacza postów kopiującego tok myślenia poprzedników.
thek
Temat miałem otwarty od przeszło godziny, ale miałem kilka spraw i musiałem odejść od kompa na jakąś chwilę zanim dałem "Wyślij" winksmiley.jpg Poza tym ku Twojemu zaskoczeniu powiem, że nie mam owej dodatkowej funkcji opartej o array_fill z prostej przyczyny... Array_fill mi nie wypełni prawidłowo już istniejącej tablicy, bo nie zgadnie jakie pola są po drodze wypełnione, a jakie nie, tylko wypełnia jak leci, nadpisując wszystko. Jeśli jakieś pola już są uzupełnione to jest bezużyteczny. Moja wersja nie robi tak, że sprawdza rozmiar, robi tablicę X na Y, uzupełnia 1 i kopiuje do niej wartości już będące, tylko uzupełnia tablicę o te brakujące pola z wartością 1. Podwójny foreach z issetem smile.gif Trickiem mniej stosowanym było wykrycie rozmiarów tej tablicy, z użyciem tylko jednego foreach. Poza tym od razu sobie go przetestowałem na boku i jestem pewien na 200%, że działa prawidłowo.
wookieb
Drogi theku, nie obchodzi mnie czy broniłeś krzyża czy też polowałeś na surykatki w Afryce. Tak samo nie obchodzi mnie reszta twojego wywodu, który był kompletnie niepotrzebny.
A dlaczego? Ponieważ mój post nie jest zachętą do nap...... w klawiaturę i kręceniu się w kółko jak motocyklista po grzybkach, lecz próbą zadania pytania "po co powtarzasz to co inni napisali?".
Ja poruszam prostą kwestię w sposób jasny a ty odpowiedziałeś na temat tym samym co ja tylko opakowanym w inny sposób = nabijanie postów. Jest to tak niesamowicie irytujące szczególnie w postaci osoby takiej "rangi" jak twoja.
Dodatkowo twój wywód podkreślił, że NADAL nie przeczytałeś treści poprzednich postów a w takiej sytuacji zachęcam Cię do zerwania paru nocek i podsumowania wszystkich tematów twoim komentarzem bo po co ktokolwiek ma pisać skoro ty musisz dać upust swojemu umysłowemu "kopiuj/wklej".

Na koniec dodam, że nie pierwszy raz łapie Cię na tego typu sytuacji.
flashdev
Cytat(wookieb @ 15.08.2010, 21:51:03 ) *
Zbyt mały pierd aby angażować całą klasę.


Czy za mały? Nie wiem.
Ja osobiście napisałbym tę klasę, choćby po to żeby w przyszłości zachoać zasadę DRY.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.