Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: tablice?
Forum PHP.pl > Forum > PHP
chomiczek
Słuchajcie potrzebuje zrobić np. taką tablicę, która będzie wyglądała tak:
0 1 0 0 1
1 0 1 1 0
0 1 1 0 0
0 1 0 0 1
0 0 0 0 1

ogólnie wielkość tablicy nie ma znaczenia, ale najważniejsze co chce osiągnąć to to, żeby zliczyć sumę elementów zarówno w pionie jak i w poziomie.

Czyli w tym przypadku powinienem otrzymać np 2 tablice - pion [1,3,2,1,3], poziom [2,3,2,2,1]

o ile to jest jeszcze połową sukcesu to później chce na podstawie tablic pion i poziom zobaczyć co miałem tam wcześniej, może tam być np. jakiś znak, chce to zastosować w OCR..

ktoś ma jakiś pomysł jak powinien wyglądać algorytm sprawdzający sumę poszczególnych linii?

a może jest dostępne gdzieś takie rozwiązanie??

edt: oczywiście pierwsza część czyli stworzenie tablicy pion i poziom jest banalne, bo wystarczy foreach i zliczyć, ale chodzi bardziej o odczytanie tablic pion i poziom i zbudowanie na ich podstawie jednej tablicy
darko
Funkcje array_combine i/lub array_merge powinny być pomocne.
Pilsener
Cytat
2 tablice - pion [1,3,2,1,3], poziom [2,3,2,2,1]
- nic prostszego, parsujesz tablicę pętlą foreach:
  1. foreach ($tablica as $tablica2){
  2. ++$licz1;
  3. foreach($tablica2 as $value){
  4. ++$licz2;
  5. echo $licz1.'|'.$licz2.'|'.$value.'<br />';
  6. }
  7. }
- pozostaje policzyć lub wprowadzić ręcznie rozmiar tablicy i w zależności od stanu liczników dodać zmienną $value do odpowiedniego indeksu nowych tablic pion i poziom.
chomiczek
@Pilsener hmm.. jakoś mi ten kod Twój nie działa..
mam wątpliwości odnośnie linii 3, skoro w 1 linijce masz:
  1. as $tablica2


poza tym tak jak pisałem utworzenie tablic pion i poziom nie jest wielkim problem.. kwestia jak z tych dwóch tablic utworzyć tablicę źródłową.

Co do tego co pisze darko to też chyba nie do końca pomocne.. ewentualnie w jaki sposób zrobić odwzorowanie płaskiej tablicy w 2 wymiarach i porównać sumy X z Y??

teoretycznie tablice można by zapisać jako:
  1. $pion = array(1,3,2,1,3);
  2. $poziom = array(2,3,2,2,1);
  3.  
  4. //a potem zapisać to tak
  5. $nowyPion = array();
  6. $nowyPion[] = '1,0,0,0,0';
  7. $nowyPion[] = '1,1,1,0,0';
  8. $nowyPion[] = '1,1,0,0,0';
  9. $nowyPion[] = '1,0,0,0,0';
  10. $nowyPion[] = '1,1,1,0,0';
  11.  
  12. $nowyPoziom = array();
  13. $nowyPoziom[] = '1,1,0,0,0';
  14. $nowyPoziom[] = '1,1,1,0,0';
  15. $nowyPoziom[] = '1,1,0,0,0';
  16. $nowyPoziom[] = '1,1,0,0,0';
  17. $nowyPoziom[] = '1,0,0,0,0';
  18.  


tylko co mi to tak naprawdę da.. tutaj rozpisałem wszystkie wartości o lewej, ale równie dobrze można by je dać od prawej.. z przecięcia takich tablic nie dostanę tego co bym chciał..
flashdev
Cytat(chomiczek @ 5.04.2010, 20:01:41 ) *
[...]
poza tym tak jak pisałem utworzenie tablic pion i poziom nie jest wielkim problem.. kwestia jak z tych dwóch tablic utworzyć tablicę źródłową.
[...]


Pytasz o to z taką pewnością, jak byś wiedział, że jest to możliwe do wykonania, a czy sprawdziłeś?

Otóż nie jest. Zamieniając główną tablicę na dwie mniejsze tracisz część informacji. Nie zawsze musi dać się w jednoznaczny sposób odwrócić tą operację.

Przykład:

mamy tablicę (1*)
1 0 0
0 1 0
0 0 1

obliczmy:
- pion: 1 1 1
- poziom: 1 1 1

I te dane owszem pasują do tablicy 1*, ale pasują również do tablicy 2*.

tablica 2*:
0 0 1
0 1 0
1 0 0
toel
Tak jak flashdev napisał jest to nie możliwe do realizacji w taki sposób jak być to chciał osiągnąć.

Jednak jeśli koniecznie potrzebujesz zrobić skrót tej tablicy polecam skorzystanie z "odwróconej dwójkowości" (nazwę właśnie wymyśliłem na potrzeby odpowiedzi ;P )


Czyli stosujemy system dwójkowy tyle, że zamiast od prawej, liczymy od lewej (jedyny sens zastosowania odwrotności jest taki, że wg mnie prościej wtedy się operuje na tablicach 2D o nieznanym wymiarze)


Czyli biorąc tą tablicę:

0 1 0 0 1
1 0 1 1 0
0 1 1 0 0
0 1 0 0 1
0 0 0 0 1

Zapis byłby następujący (jeśli się nie pomyliłem) dla wierszy

17
13
6
18
16

I to starczy bo właściwie kolumny odtworzą Ci się same z siebie, więc nie ma sensu robić zliczania kolumnowego...


[edit]

Nie sprawdzałem tego kodu ale powinno zadziałać (tab to twoja tabliza 01)
  1. $new_arr=array();
  2.  
  3. for($i=0;$i<sizeof($tab);$i++)
  4. {
  5. $bin=1;
  6.  
  7. $cnt=0;
  8.  
  9. for($j=0;$j<sizeof($tab[$i]);$j++)
  10. {
  11. $cnt=$cnt+($tab[$i][$j]*$bin);
  12.  
  13. $bin=$bin*2;
  14. }
  15.  
  16. $new_arr[]=$cnt;
  17. }

Psychopath
Hmm, troszkę się pomęczyłem i nie wiem jaki jest powód, ale działa dobrze do momentu.

  1. <?php
  2. $cyfry = array(
  3. array(0,1,0,0,1),
  4. array(1,0,1,1,0),
  5. array(0,1,1,0,0),
  6. array(0,1,0,0,1),
  7. array(0,0,0,0,1)
  8. );
  9.  
  10. // Poziomo
  11. foreach($cyfry as $linia){
  12. $suma1 = array_sum($linia);
  13. $suma["poziomo"][$numer] = $suma1;
  14. $numer = $numer+1;
  15. echo "Suma pozioma tablicy numer $numer to $suma1<br />";
  16. }
  17. echo "<hr />";
  18.  
  19. // Pionowo
  20. $ilosc_elementow_pn = count($cyfry);
  21. $ilosc_elementow_pz = count($cyfry[0]); //Dla jednakowej ilości elementów w każdym array'u
  22.  
  23.  
  24. $a = 0;
  25. $sumax = 0;
  26. $x = 0;
  27.  
  28. while($x <= $ilosc_elementow_pz){
  29. while($a <= $ilosc_elementow_pn){
  30. $sumax = $sumax + $cyfry[$a][$x];
  31. $a = $a+1;
  32. if($a == $ilosc_elementow_pn){
  33. $suma["poziomo"][$x] = $sumax;
  34. $sumax = 0;
  35. echo "Suma pionowa tablicy numer $x to ".$suma["pionowo"][$x]."<br />";
  36.  
  37. }
  38. }
  39. $a = 0;
  40. $x = $x+1;
  41. }
  42. ?>


Wszystko powinno być ok jak na to patrzę, ale coś nie gra, przynajmniej na localhoscie. Poziomo oblicza normalnie, pionowo już nie do końca. To pewnie wina zmęczenia, kodzę od jakichś 16 godzin z przerwą na obiad:P

EDIT: Napisałem, i 10 sekund później znalazłem buga, już poprawione:)
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.