ugrás a tartalomhoz

Tömb elemeinek csoportosítása

vtsoftware · 2011. Jún. 11. (Szo), 21.47
Üdvözletem mindenkinek!

Egy tömb elemeit szeretném csoportosítani.

Jelenleg a kódom:
$ci=1;
for($i=0;$i < count($tomb)-1;$i++) {
  $ci=1;
  if ($last != $it) {
    $oszlopok[$i][0]=$it;
    $oszlopok[$i][1]=$ci;
    $last=$it;
  } else {
    $ci=$ci+1;
    $oszlopok[$i-1][1]=$ci;
  }
}
Adott egy tömb:
$tomb=array("autó", "autó", "motor", "autó", "autó");
Kiírja: (var_export)
array (
  0 => 
  array (
    0 => 'autó',
    1 => 2,
  ),
  2 => 
  array (
    0 => 'motor',
    1 => 1,
  ),
  3 => 
  array (
    0 => 'autó',
    1 => 2,
  ),
)
Ha viszont a tömb:
$tomb=array("motor", "autó", "autó", "autó", "motor");
Kiírja: (var_export)
array (
  0 => 
  array (
    0 => 'motor',
    1 => 1,
  ),
  1 => 
  array (
    0 => 'autó',
    1 => 2,
  ),
  2 => 
  array (
    1 => 2,
  ),
  4 => 
  array (
    0 => 'motor',
    1 => 1,
  ),
)
Itt a bökkenő, valamiért nem 3 autót ír hanem kettőt és ott egy "üres" elem is.
Valaki ha tudna segíteni helyrehozni a bakit, nagyon hálás lennék...

Előre is köszönöm
 
1

Bajok

janoszen · 2011. Jún. 11. (Szo), 22.35
Az első számú probléma, hogy for ciklusban nem használunk count() hívást, mert az minden egyes ciklus futásra kiértékelődik. Van erre egy nagyon király nyelvi elem foreach néven.

Ami még baj, hogy az $it változód egyáltalán nincs definiálva az általad bemásolt kódrészben, innentől kezdve szerintem, először ezt kellene helyre hozni. Javaslom, hogy kapcsold be a notice típusú üzenetek kijelzését, azok egy csomó programozási hibára rávilágíthatnak. Ha azok ki vannak javítva, üzemelj be egy debuggert (pl. Xdebug) és léptesd végig a programkódodat.
2

Jogos

vtsoftware · 2011. Jún. 11. (Szo), 23.13
Igen, mindenben igazat adok, de ezt csak úgy összedobtam hogy működjön, nem ez a végleges, csak a működőképesség a célom először.

Tehát a javított kódrész:
$ci=1;
$tdb=count($tomb);
for($i=0;$i < $tdb-1;$i++) {
  $ci=1;
  $it=$tomb[$i];
  if ($last != $it) {
    $oszlopok[$i][0]=$it;
    $oszlopok[$i][1]=$ci;
    $last=$it;
  } else {
    $ci=$ci+1;
    $oszlopok[$i-1][1]=$ci;
  }
}
A foreach azért nem jó mert eredetileg nem egy tömbön kell végiglépkedni hanem egy kép pixelein, de ez szerintem a lényegen nem változtat.
3

Debugger?

janoszen · 2011. Jún. 12. (V), 08.49
Az a baj, hogy nem nagyon értem, mi lenne a vágyott végeredmény, de feltétlenül ismerkedj meg a debuggerrel, mert azzal végig tudod léptetni a ciklust és rá tudsz jönni, mi a baj.
4

Már megvan...

vtsoftware · 2011. Jún. 12. (V), 12.59
Már megvan a debugger, csak még nagyon új, bár el kell ismernem nem rossz dolog, csak nem értem mire gondolsz mit csináljak vele...

A tömbön kellene végiglépkednem és egymás után kiírni hogy egy elem hányszor van benne.
A baj hogy nem tudom máshogy megfogalmazni... :(
5

Histogrammot akarsz

H.Z. v2 · 2011. Jún. 12. (V), 13.25
Histogrammot akarsz készíteni?

Függetlenül attól, hogy azt akarsz-e vagy sem, inkább asszociatív tömböt használnék e célra, ahol a kulcs lehetne a pixeled színe/fényessége/stb.

$tomb=array();

és ezt berakod a ciklusba, ami végigmegy a pixeleken:
@$tomb[$pixelinformacio_ami_alapjan_gyuktod_az_adatokat]++;

A @ csak azért, hogy ne pofázzon a még nem létező indexekre.
7

Szerény értelm(ezés)em

kuka · 2011. Jún. 12. (V), 14.25
Szerény értelm(ezés)em szerint array_count_values() itt teljesen haszontalan, lévén a kérdező nem teljes előfordulásokra, hanem egymásutáni előfordulásokra vadászik. Mint a kezdetleges kép tömörítő algoritmus (talán PCX csinálta így): 3 piros pixel, 1 fekete pixel, 2 piros pixel, ...

Sajnálom, annyi energiám nincs, hogy az eredeti kódban megkeressem a hibát. Ha ez segít, én így csinálnám:

$oszlopok=array();
$utolso=null;
$csoport=-1;
foreach ($tomb as $elem) {
  if ($utolso!=$elem) $oszlopok[++$csoport]=array($utolso=$elem,1);
  else $oszlopok[$csoport][1]++;
}
8

Hát ha arra kíváncsi, akkor

inf · 2011. Jún. 12. (V), 14.37
Hát ha arra kíváncsi, akkor is ugyanúgy egy asszociatív tömböt kell létrehoznia, aztán egyenként növelni kell rajta az értékeket.
9

Én meg arra volnék kíváncsi,

kuka · 2011. Jún. 12. (V), 15.20
Én meg arra volnék kíváncsi, hogy mit lehet ebben az esetben kezdeni egy asszociatív tömbbel. A kiinduló példa világosan mutatja, hogy semmit.
10

Amíg csak találgatunk, hogy

H.Z. v2 · 2011. Jún. 12. (V), 17.17
Amíg csak találgatunk, hogy mi a valódi feladat... ;-)
Ha histogram, akkor jó az asszociatív tömb, ha valami tömörítés jellegű dolgon töri a fejét a kérdező, akkor persze semmit. (vagy ki tudja :-) )
11

Hát ezaz :D Lehet, hogy még ő

inf · 2011. Jún. 12. (V), 17.20
Hát ezaz :D Lehet, hogy még ő sem tudja, hogy mit akar :D
12

Nemár...

vtsoftware · 2011. Jún. 12. (V), 17.45
Hogyne tudnám mit akarok, nem vagyok idióta...

A megfogalmazással volt a problémám, de leginkább "kuka" - 14.25 trafált bele, pontosan erre gondoltam, a kód tökéletesen bevált... 1000 köszönet.

...Mindenkinek!