Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Multidimenzionalni niz ili neko drugo resenje?

[es] :: PHP :: Multidimenzionalni niz ili neko drugo resenje?

[ Pregleda: 1855 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Mister Big Time
The Consigliere
enterparadajz
Belgrade

Član broj: 15306
Poruke: 4747

Sajt: www.go2bed.net


+43 Profil

icon Multidimenzionalni niz ili neko drugo resenje?17.07.2011. u 00:58 - pre 155 meseci
Imam veliki string koji dolazi iz sekvencijalnog fajla (ili socket-a preko mreze). Delimiteri su definisani (kraj svakog polja, kraj reda), pa kada ulazni string sa mnogo podataka napunim u array:
Code:

list($id, $jmbg, $ime, $dat, $kon) = explode(",", $ulaz);
echo "<u><b>UID: $id</b></u> ";
echo "<b>".$jmbg."</b>";
echo "<b>".$ime."</b>";
echo "<b>".$dat."</b>";
echo "<b>".$kon."</b>";


Radi OK ali naravno samo za prvi element (tj. coveka). Problem je sto je potrebno da se procita i ostatak ulaznog buffer-a pri cemu niz nije konstantan, vec moze biti za jednog coveka vise podataka, za drugog samo jedan itd.

Ono sto je poznatno i fixno - 5 polja svaki covek mora da ima, ali kada ima vise podataka za jedan element niza tj. coveka iz ulaza polja koja se ponavljaju su prazna.


Primer jednog reda:
111, 1414785201474, PeraPeric, 11072011, 45600;
222, 4545787985210, MarkoMarkic, 08072011, 36500;
....


Slucaj kada za jednoga ima vise podataka:
111, 1414785201474, PeraPeric, 11072011, 45600;
, , , 13072011, 44900;
222, 4545787985210, MarkoMarkic, 08072011, 36500;
itd.

Dakle polja koja su ista preskacu se tj. prazna su ali postoje delimiteri svakako.

Pokusavam nesto sa multidimenzionalni nizom, ali nisam siguran da li sam na pravom putu.

Ono sto mi treba jeste prikaz u HTML tabeli, gde bi navedena polja bila prikazana za svakog coveka, dok za one sa vise podataka bi bilo isto kao iz buffer-a, tj. prazna polja (ili na drugi nacin formatirano HTML-om).

Savet?









 
Odgovor na temu

Zlatni_bg
Nikola S
Beograd

Član broj: 65708
Poruke: 4420
*.dynamic.sbb.rs.



+498 Profil

icon Re: Multidimenzionalni niz ili neko drugo resenje?17.07.2011. u 09:12 - pre 155 meseci
Nisam bas siguran sta zelis (nisam spavao celu noc), ali ono sto sam shvatio je da ti je problem da generises HTML tabelu jer ti nedostaju podaci.

Code:


<?php

$ulaz = ", , , 13072011, 44900";

list($id, $jmbg, $ime, $dat, $kon) = explode(",", $ulaz);

if ($id == ' ') $id = '&nbsp;';
if ($jmbg == ' ') $jmbg = '&nbsp;';
if ($ime == ' ') $ime = '&nbsp;';
if ($dat == ' ') $dat = '&nbsp;';
if ($kon == ' ') $kon = '&nbsp;';



echo "<u><b>UID: $id</b></u> ";
echo "<b>" . $jmbg."</b>";
echo "<b>" . $ime."</b>";
echo "<b>" . $dat."</b>";
echo "<b>" . $kon."</b>";
?>



Ne znam koliko sam ti pomogao sa ovim, ali na ovaj nacin popunjavas sve svoje promenljive i dobijas mogucnost pravilnog generisanja HTML tabele. &nbsp; ti pravi razmak u promenljivoj, tj. pravi ti prazno polje, kao sto si trazio :)

Nisam te razumeo samo da li ti je problem i iscitavanje celokupnog buffera?

Ako jeste, ja bih uradio jos jedan explore, pre ovog koji sada imas, koji bi radio po ";" delimiteru.


Izvini ako sam dao los odgovor, ili te nisam lepo shvatio, nisam spavao pa slabo shvatam trenutno... :) Pozdrav!
THE ONLY EASY DAY WAS YESTERDAY
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
109.121.49.*



+33 Profil

icon Re: Multidimenzionalni niz ili neko drugo resenje?17.07.2011. u 11:04 - pre 155 meseci
Ja to ne bih odma' ispisivao, vec bih grupisao te podatke po tom UID-u, pošto je taj podatak unique. Npr. ovako nešto:
Code:
$podaci = array();

while($ulaz = nekoCitanjeUlaza()) {
    list($id, $jmbg, $ime, $dat, $kon) = explode(',', $ulaz);
    
    if (isset($podaci[$id]) {
        if (!is_array($podaci[$id]['dat'])) {
            $podaci[$id]['dat'] = array($podaci[$id]['dat']);
        }
        $podaci[$id]['dat'][] = $dat;
        
        if (!is_array($podaci[$id]['kon'])) {
            $podaci[$id]['kon'] = array($podaci[$id]['kon']);
        }
        $podaci[$id]['kon'][] = $kon;
    } else {
        $podaci[$id] = array(
            'jmbg' => $jmbg,
            'ime' => $ime,
            'dat' => $dat,
            'kon' => $kon
        );
    }
}

To "nekoCitanjeUlaza()" je neki mehanizam kojim dolaziš do jednog reda ($ulaz). Takođe, primetićeš da sam ja pretpostavio da "jmbg" i "ime" ne mogu da ponove za neku osobu (kao ni "id"), već da samo tih "dat" i "kon" informacija može da bude više za jednu osobu.

I naravno, sad te podatke možeš da ispišeš kako god hoćeš:
Code:
foreach($podaci as $id=>$red) {
    echo 'UID: <u><b>: ' . $id . '</b></u>';
    echo 'JMBG: <b>' . $jmbg . '</b>';
    echo 'Ime: <b>' . $ime . '</b>';
    echo 'Dat: <b>' . (is_array($dat) ? implode(', ', $dat) : $dat) . '</b>';
    echo 'Kon: <b>' . (is_array($kon) ? implode(', ', $kon) : $kon) .'</b>';
    echo '<hr />';
}
 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
109.121.49.*



+33 Profil

icon Re: Multidimenzionalni niz ili neko drugo resenje?17.07.2011. u 14:40 - pre 155 meseci
Samo sad sam tek video šta sam napisao... U slučaju da za jednog čoveka ima više podataka, onda za taj n-ti red za jednu osobu neće biti set-ovan taj "id" (npr. , , , 13072011, 44900), pa taj uslov if (isset($podaci[$id]) praktično nikada neće proći. Taj deo bi trebalo izmeniti ovako:
Code:
$podaci = array();

$lastId = 0;
while($ulaz = nekoCitanjeUlaza()) {
    list($id, $jmbg, $ime, $dat, $kon) = explode(',', $ulaz);
    
    if (strlen($id) === 0) { //Id je prazan?
        if (!is_array($podaci[$lastId]['dat'])) {
            $podaci[$lastId]['dat'] = array($podaci[$lastId]['dat']);
        }
        $podaci[$lastId]['dat'][] = $dat;
        
        if (!is_array($podaci[$lastId]['kon'])) {
            $podaci[$lastId]['kon'] = array($podaci[$lastId]['kon']);
        }
        $podaci[$lastId]['kon'][] = $kon;
    } else {
        $podaci[$id] = array(
            'jmbg' => $jmbg,
            'ime' => $ime,
            'dat' => $dat,
            'kon' => $kon
        );

        $lastId = $id;
    }
}
 
Odgovor na temu

Mister Big Time
The Consigliere
enterparadajz
Belgrade

Član broj: 15306
Poruke: 4747

Sajt: www.go2bed.net


+43 Profil

icon Re: Multidimenzionalni niz ili neko drugo resenje?18.07.2011. u 00:26 - pre 155 meseci
Hvala puno Zlatni i Nikola!

Nisam danas stigao da se pozabavim ovim, sutra cu se nakaciti remote pa da probam direktno sa fsockopen kao ulaznim stream-om.

Javljam da li je proradilo, Nikolino resenje mi se cini kao odlicno ali cu morati neke sitnice da uradim kao sto je trim i substr kobasice posto je na pocetku svega ID firme/whatever...

Pozdrav!



 
Odgovor na temu

Zlatni_bg
Nikola S
Beograd

Član broj: 65708
Poruke: 4420
*.dynamic.sbb.rs.



+498 Profil

icon Re: Multidimenzionalni niz ili neko drugo resenje?18.07.2011. u 00:58 - pre 155 meseci
Samo ako mogu da skrenem paznju Nikoli na tom resenju, ne znam da li moze tako kako si napisao. UID cini mi se nije unikatan, bar vidim po primerima koje je Mister dao. Nisam siguran da li je ista od promenljivih unikatno iz primera.

[Ovu poruku je menjao Zlatni_bg dana 18.07.2011. u 10:41 GMT+1]
THE ONLY EASY DAY WAS YESTERDAY
 
Odgovor na temu

Mister Big Time
The Consigliere
enterparadajz
Belgrade

Član broj: 15306
Poruke: 4747
Via: [es] mailing liste

Sajt: www.go2bed.net


+43 Profil

icon Re: Multidimenzionalni niz ili neko drugo resenje?18.07.2011. u 14:30 - pre 155 meseci
Evo me..
Nesto i nece, nista mi ne prikazuje Nikolin foreach kod.

Sadrzaj ulaznog stream-a je malo izmenjen, tako da je sada format:

0405971317109; MIRANOVIC MIRA ; ;20101130;##
; ; ; 20101201; ;##
; ; ; ;20110228;##

## - oznacava kraj svakog reda, dok je ; delimiter izmedju svakog polja.

ID vise ne postoji tj. njegovo mesto je zauzeo JMBG kao "primarni kljuc".

Iz navedenog primera se vidi da za jednu osobu podaci u poljima su: JMBG;
IME; DATUM_OD; DATUM_DO
Redosled je uvek isti, samo sto su prazna polja u drugom redu kada se ti
podaci ponavljaju tj. JMBG i Ime su prazni ali sa delimiterima.


Code:


echo ' sto nece.......      ';

$data = file_get_contents("kobaja.txt"); //ulazni stream (mada ovde treba da
bude fsockopen...

echo $data; // radi OK...


$data = array();

$lastId = 0;
while($ulaz = $data) {
    list($id, $ime, $dat, $kon) = explode(';', $ulaz);

    if (strlen($id) === 0) { //Id je prazan?
        if (!is_array($data[$lastId]['dat'])) {
            $data[$lastId]['dat'] = array($data[$lastId]['dat']);
        }
        $data[$lastId]['dat'][] = $dat;

        if (!is_array($data[$lastId]['kon'])) {
            $data[$lastId]['kon'] = array($data[$lastId]['kon']);
        }
        $data[$lastId]['kon'][] = $kon;
    } else {
        $data[$id] = array(
             'ime' => $ime,
            'dat' => $dat,
            'kon' => $kon
        );

        $lastId = $id;
    }
}

foreach($data as $id=>$red) {
    echo 'UID: <u><b>: ' . $id . '</b></u>';
       echo 'Ime: <b>' . $ime . '</b>';
    echo 'Dat: <b>' . (is_array($dat) ? implode(', ', $dat) : $dat) .
'</b>';
    echo 'Kon: <b>' . (is_array($kon) ? implode(', ', $kon) : $kon) .'</b>';
    echo '<hr />';
}


 
Odgovor na temu

Mister Big Time
The Consigliere
enterparadajz
Belgrade

Član broj: 15306
Poruke: 4747

Sajt: www.go2bed.net


+43 Profil

icon Re: Multidimenzionalni niz ili neko drugo resenje?18.07.2011. u 16:27 - pre 155 meseci
Mozda je post delovao konfuzno.... sludjen sam vise.

Iz ulaznog toka podataka postoji uvek PET polja razdvojenih tacka zarezom ;
Na kraju svakog reda je znak ##

Sta je ideja:

Da se ta 'kobasica' koja je u sustini jedan red sa whitespace-ovima lepo parsira i formatira u HTML tabeli.

Prvo polje je nekakav ID firme, on se pojavljuje SAMO na pocetku tj. samo prvi red je kompletan u formatu:

1111 ; 202020202020 ; PALIZARI ; 20110101 ; 20110303 ; ##
Firma JMBG IME OD DO


Drugi redovi:

; 772020202020 ; ZARI ; 20110102 ; 20110305 ; ##
; 882020202020 ; PALI ; 20110103 ; 20110306 ; ##
; 992020202020 ; PALIZARIPALI ; 20110104 ; 20110307 ; ##
Firma JMBG IME OD DO



Slucaj kada za jednu osobu ima vise podataka (bez ponavljanja prvih par polja):

; 772020202020 ; ZARI ; 20110104 ; 20110306 ; ##
; ; ; 20110102 ; 20110305 ; ##
Firma JMBG IME OD DO



Svi naredni redovi se listaju po ovom modelu s tim sto kao sto smo vec apsolvirali ranije, kada za jednu osobu ima vise podataka (datum od - do) onda su prva polja prazna (JMBG, Ime...).

Sada pravim neko prostacko resenje pomocu str_replace, gde sam sve ## pretvorio u <br> tagove...

Sada bi trebalo jedan foreach za svaki red, plus da se izbroje polja (5 u svakom redu) i uslov if prazan string onda da udari prazan <td> ili nbsp...

 
Odgovor na temu

Nikola Poša
Backend (PHP) developer
Beograd

Član broj: 173839
Poruke: 1616
*.adsl-a-1.sezampro.rs.



+33 Profil

icon Re: Multidimenzionalni niz ili neko drugo resenje?18.07.2011. u 17:48 - pre 155 meseci
U tom kôdu iz prethodnog post-a, nigde nemaš razbijanje po "##"? Šta ti znači ovaj deo: while($ulaz = $data)? A pritom pre toga radiš ovo: $data = array();. Nadam se da ti je jasno da se nikad neće ući u taj while loop, a samim tim ni u foreach($data as $id=>$red), jer $data će uvek biti prazno... Da ne pričamo o tome da ti se ta promenljiva u koju si učitao sadržaj fajla i taj niz kojeg nameravaš da napuniš podacima zovu isto - $data.

Ja sam ti gore poslao rešenje za parsiranje pojedinačnih redova, misleći da ti već imaš mehanizam za fetch-ovanje istih... Ili uzmi isčitavaj taj fajl red po red, ili ceo sadržaj najpre explode-uj po "##", kako bi prvo dobio sve redove, ili taj posao uradi koristeći file() funkciju. Tek kad to uradiš možeš da iskoristiš ovo što sam ja napisao u prethodnom post-u.
 
Odgovor na temu

Mister Big Time
The Consigliere
enterparadajz
Belgrade

Član broj: 15306
Poruke: 4747

Sajt: www.go2bed.net


+43 Profil

icon Re: Multidimenzionalni niz ili neko drugo resenje?18.07.2011. u 21:16 - pre 155 meseci
Radim pet stvari u isto vreme, obnevideo sam vise (devojka za sve xD)....


Uglavnom na kraju sam resio na vrlo prost(acki) nacin pomocu str_replace... Nekad ne treba badava razbijati glavu.

Nije mi kod pri ruci, sutra cu postovati, ali moze se naglasiti - str_replace novog reda (##) kao BR tag, a svaki delimiter polja ; zamenjen sa zatvoren/otvoren TD tag.
Jedan echo pre svega koji pravi tabelu, TH, TR i prvi otvoreni TD... i isto to na kraju kobasice koji zatvara sve respektivno.
A onaj ID firme posto se javlja samo na pocetku sam substringovao u posebnu varijablu koju mogu da setam gde zelim (u legend tag iznad tabele npr).

Ostaje da ga malo doteram (CSS) i trebalo bi da bude zadovoljavajuce resenje.

Mada kada budem imao vremena bas me je zaintrigiralo ovo na 'tezi' nacin da resim, ovo je ipak ispis na silu jer su podaci u logicnom sledu, ali da nisu bio bi problem zbog fixne tabele.


while($ulaz = $data) --> izbacio sam tvoju f-ju jer je nemam Sada vidim da sam se spucao nacisto... xD


Hvala puno na vremenu i pomoci Nikola i Zlatni_bg, kada probam i 'tezi nacin' javljam

 
Odgovor na temu

Zlatni_bg
Nikola S
Beograd

Član broj: 65708
Poruke: 4420
*.dynamic.sbb.rs.



+498 Profil

icon Re: Multidimenzionalni niz ili neko drugo resenje?19.07.2011. u 00:43 - pre 155 meseci
Jel mozes samo da mi kazes koja aplikacija i kako izbacuje te podatke? Neki izvrsni fajl, koji ispisuje to preko socketa? Jel ispisuje u razlicitom vremenskom roku, ili odjednom izbaci sve redove koji su potrebni? Nije mi bas jasno kako sve to funkcionise, a vidim spominjao si sockete :) Mozda sam PHP nije najbolje resenje. Perl skripta, ili daemon, bi mozda dosta pomogao...

Ono nazalost mnogo kompleksnije i verovatno sporije, koje zauzima vise resursa, je da ukljucis u sve to neku bazu podataka... ako bas nikako ne ide preko samog PHP-a... da se sve to upise prvo u MySQL bazu pa da se potom ispisuje preko PHP skripte... (vec vidim kako ce me vecina PHP programera napasti zbog ovoga :) )
THE ONLY EASY DAY WAS YESTERDAY
 
Odgovor na temu

Mister Big Time
The Consigliere
enterparadajz
Belgrade

Član broj: 15306
Poruke: 4747

Sajt: www.go2bed.net


+43 Profil

icon Re: Multidimenzionalni niz ili neko drugo resenje?03.08.2011. u 08:00 - pre 155 meseci
Ostao sam duzan odgovor..

Podaci dolaze preko socketa:


Code:

$fp = fsockopen($masina, $porter, $errno, $errstr, 30);
if (!$fp) {
    echo "Servis trenutno nije dostupan. $errstr ($errno)<br />\n";

else 
    {
    $out = "GET $metod HTTP/1.1\r\n";
    $out .= "Host: $masina\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        $podaci = fgets($fp);
      //  echo $podaci;
        
    }
    fclose($fp);
}


Malo ih doterujem:

Code:
$vbrojac = ltrim($brojac, "0"); // odseca nule sa leve strane stringa

$linije = explode("@", $kobajagrande); //pretvara u niz svaki red po dogovorenom delimiteru iz ulazne kobasice 

$brojanka = count($linije); // broji ceo niz
$redovi = $brojanka -1; //moj brojac, odseca visak


Ispis svega u tabeli, dinamicki:

Code:

echo "<fieldset><legend><b>ID:</b> $idv ----- <b>Lokacija:</b> $opsv ----- <b>Redova:</b> $redovi ----- $vreme</legend>";


echo '<table id="differ" cellpadding="3" border="0"><tr><th>&#8470;</th><th>ID</th><th>JMBG</th><th>IME</th><th>OD</th><th>DO</th></tr>';


foreach ($linije as $broj => $polja)
{
list($id, $mb, $ime, $datod, $datdo) = explode(";", $polja);

if ($datod != "" or $datdo != "") {

    echo '<tr class="senka">';

    echo "<td align='right'>";
    echo $broj +1;
    echo ".</td>";

    echo "<td><b>";
    echo $id;
    echo "</b></td>";

    echo "<td>";
    echo $mb;
    echo "</td>";

    echo "<td>";
    echo $ime;
    echo "</td>";

    echo "<td>";
    echo $datod;
    echo "</td>";

    echo "<td>";
    echo $datdo;
    echo "</td>";

    echo "</tr>";
}


}

echo '</table></fieldset>';





[Ovu poruku je menjao Mister Big Time dana 03.08.2011. u 09:16 GMT+1]
 
Odgovor na temu

[es] :: PHP :: Multidimenzionalni niz ili neko drugo resenje?

[ Pregleda: 1855 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.