» »

Sortiranje podatkov v PHPju

Sortiranje podatkov v PHPju

poweroff ::

OK, najprej obvestilo za admine - tole ni web-programming vprasanje, zato se mi zdi da bi pasalo sem.

Gre pa za tole.
Imam podatke v tabeli urejene takole:
[id_osebe][web_site]

To so podatki o tem kdo je obiskal kaksen website.

Jasno - en lahko obisce website veckrat.

Sedaj bi pa rad podatke dal v takole tabelo:
id_osebe website1 website2,...

Za vsak id osebe bi rad kolikokrat je obiskala posamezen website. Ne vem pa vnaprej koliko je vseh websitov v bazi.

Primer
os1 w1
os2 w1
os1 w2
os1 w1

Rezultat bi bil
id_osebe ; website1 ; website2
os1 ; 2 ; 1
os2 ; 1 ; 0

Kako to narediti... v PHPju?

ToniT ::

Lahko ti dam odgovor v T - SQL, pa ga pretvori v PHP

TRANSFORM Count(Tabela1.Id)
SELECT Tabela1.Id FROM Tabela1
GROUP BY Tabela1.Id
PIVOT Tabela1.website;

darh ::

če te prav razumem, maš ti en array z podatki ? al vlečeš iz baze? no.. v bistvu sploh ni važno...

če imaš takole:
$array[user_id] = $website;


potem začaraš tole:

foreach ( $array as $userID => $website )
{
$results[$userID][$website]++;
// lahko dodaš še pomožni array, da vidiš kolk razližnih sajtov sploh je
$results_websites[] = $website;
}


podatke pa predtaviš nato z dvojno zanko

// da bodo strani po vrsti (recimo...)
sort ($results_websites);

foreach ( $results as $userID => $websites_counter )
{
//uporabnikov ID
echo "$userID; ";
foreach ( $results_websites as $website )
{
// pogledamo za vsako stran koliko jih je oziroma izpišemo 0
echo ( $websites_counter[$website] ? $websites_counter[$website] : 0 );
echo "; ";
}
echo "\n";
}



nisem testiral neč, mislm da ni nobene take napake k je nebi znal popravt sam..

lp,x
Excuses are useless! Results are priceless!

poweroff ::

Ni čisto tako...

Če prav razumem zadevo, je $array[user_id] = $website; narejen tako, da gredo user_id-ji od npr. 1 do n.

Vsak user_id pa ima nato svoj $website???

No, pri meni je zadeva taka da lahko en user obisce vec sitov.

Oziroma... kako moje podatke v obliki

user1 website1
user1 website2
user2 website2
user1 website1

odčitati v ta $array?

darh ::

ooops... sory.. mal sm zajebal... :)

ampak drugi del rešitve lahko uporabiš.. an :)
Excuses are useless! Results are priceless!

poweroff ::

Hmm, maybe I am stupid... gledam tvojo kodo pa ne uspem nič pametnega ugotoviti...

OK, tole sem naumio:

$fd = fopen ("data.txt", "r"); // open file for reading
$counter = 1;
while (!feof ($fd)) {
$fileline = fgets($fd, 4096);

// Replace line breaks at the end /r=DOS /n=Unix
$fileline = str_replace("\n","",$fileline);
$fileline = str_replace("\r","",$fileline);

$line = explode("\t", $fileline);
$website[$counter-1] = $line[1];
$userID[$counter-1] = $line[0];
$counter++;
}

Imamo torej variable $website in $userID..

data.txt je pa takle file:
user1 web1
user1 web2
user2 web2
user1 web1

Od tu dalje mi ni jasno... kaj dela foreach... sem se nekaj caral, pa mi ni izpisal tako kot bi bilo treba...
Lahko malce bolje razlozis?

poweroff ::

OK, sem ze ugotovil kako to narediti... ima pa sledeci problem... zadevo bi rad zapisal v file in NE na zaslon...

Če dam
print $sites[$website[$i]]?$sites[$website[$i]]:0;

takole:

if (fwrite($fp, "$sites[$website[$i]]?$sites[$website[$i]]:0")==-1) {
$error = 1;
}


mi javi napako... kako tole urediti da ne bo napake?

poweroff ::

OK, tole sem rešil z eno if zanko... zanima me če obstaja bolj elegantna rešitev...

Sedaj pa imam še dva podobna problema:

Podatki so isti (v isti obliki), rad pa bi naredil se tole:

a) matriko websitov, kjer so v celicah counti števila userjev ki so bili hkrati na obeh sajtih

Recimo:
[******] [web1] [web2]
[web1] [a] [b]
[web2] [c] [d]

a = število userjev, ki so bili na web1
b = št. userjev, ki so bili HKRATI na web1 in web2
c = b
d = št. userjev, ki so bili na web2

b) Recimo da imam v tisti osnovni datoteki še datum.
Sedaj me pa zanima koliko userjev je potovalo med web-i.

Ne vem če razumete, bom skušal razložiti.
User ima svoj ID. Ko se giblje po web-ih (to so v bistvu spletni dokumenti na mojem sajtu) gre recimo takole:
user1: web1 -> web2 -> web1 -> web3
user2: web1 -> web3
user3: web3 -> web1 -> web3

OK, torej imamo naslednje možne odnose:
web1 -> web2 (se pojavi 1x)
web2 -> web1 (se pojavi 1x)
web1 -> web3 (se pojavi 3x)
web3 -> web1 (se pojavi 1x)
web2 -> web3 (se pojavi 0x)
web3 -> web2 (se pojavi 0x)

To pa lahko isto poredstavimo v matriki web-ov, kjer so v celicah ti podatki. No, ta matrika za razliko od zgornje NI simertična.

V glavnem - kako narediti še ti dve transformaciji?

poweroff ::

Aja, pa še delujoč programček za prvo transformacijo, če koga zanima rešitev problema (upam da ne smetim preveč po forumu...): http://www.ljudmila.org/matej/count/res...


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Predlog - tabela - plačilni sistemi

Oddelek: Programiranje
5901 (710) programercek
»

php skripta za registracijo uporabnikov

Oddelek: Izdelava spletišč
162000 (1581) skorpio
»

[php, mysql] sortiranje izpisa iz baze

Oddelek: Izdelava spletišč
262565 (2084) Binji
»

SQL select problemček

Oddelek: Programiranje
71009 (879) darh

Več podobnih tem