Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Inicjalizacja tablicy dwuwymiarowej
Demoneos
post 15.08.2010, 16:04:09
Post #1





Grupa: Zarejestrowani
Postów: 149
Pomógł: 0
Dołączył: 26.02.2008

Ostrzeżenie: (0%)
-----


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ć?


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
wookieb
post 15.08.2010, 20:43:27
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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


--------------------
Go to the top of the page
+Quote Post
flashdev
post 15.08.2010, 20:48:05
Post #3





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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.


--------------------
Go to the top of the page
+Quote Post
wookieb
post 15.08.2010, 20:51:03
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Zbyt mały pierd aby angażować całą klasę.

Ten post edytował wookieb 15.08.2010, 20:51:17


--------------------
Go to the top of the page
+Quote Post
thek
post 15.08.2010, 21:13:09
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
wookieb
post 15.08.2010, 21:15:28
Post #6





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




@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.


--------------------
Go to the top of the page
+Quote Post
thek
post 15.08.2010, 21:49:36
Post #7





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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.


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
wookieb
post 15.08.2010, 22:05:06
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




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.

Ten post edytował wookieb 15.08.2010, 22:28:15


--------------------
Go to the top of the page
+Quote Post
flashdev
post 15.08.2010, 22:37:36
Post #9





Grupa: Zarejestrowani
Postów: 812
Pomógł: 117
Dołączył: 2.12.2008

Ostrzeżenie: (10%)
X----


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.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 01:14