DevProTalk

DevProTalk (http://www.devprotalk.com/index.php)
-   PHP (http://www.devprotalk.com/forumdisplay.php?f=9)
-   -   Dodati element u asocijativni niz ne prepisujući postojeći (http://www.devprotalk.com/showthread.php?t=3273)

Nemanja Avramović 28. 07. 2007. 15:24

Dodati element u asocijativni niz ne prepisujući postojeći
 
Da li je ovo moguće?
Naime, pravim neku hall of fame listu ali bez baze podataka (sa bazom bih završio bez ikakvih problema). Evo kako sam ja to uradio:

Imam fajl rezultati.txt u kojem su zapisani razultati u formatu:
igrač:brojpoena

Znači:
Citat:

Avram:10000
Avram:9000
Avram:8000
Avram:7000
Avram:6000
Avram:5000
Avram:4000
Avram:3000
Avram:2000
Avram:1000
Sada treba napraviti da, kada se doda novi igrač sa recimo 5500 poena, on upadne između Avram:6000 i Avram:5000 a da Avram:1000 nestane sa liste.

Evo šta sam do sada uradio:

Kôd:

<?php
$lista = file('rezultati.txt');

$element = 'Nemanja:5500'; //ovo je samo za test

$delovi = explode(':',$element);
$imence = $delovi[0];
$poencici = $delovi[1];

$mojniz = array();

foreach ($lista as $stavka) {
        $p = explode(':',$stavka);
        $mojniz[trim($p[1])] = trim($p[0]);
}

$mojniz[$poencici] = $imence;
krsort($mojniz,SORT_NUMERIC);

print_r($mojniz);
?>

Ovo radi lepo, na kraju dobijem niz tipa:

Citat:

Array
(
[10000] => Avram
[9000] => Avram
[8000] => Avram
[7000] => Avram
[6000] => Avram
[5500] => Nemanja
[5000] => Avram
[4000] => Avram
[3000] => Avram
[2000] => Avram
[1000] => Avram
)
Lako ću da uzmem prvih 10 i da zapišem nazad u fajl. Međutim, problem je kada dođe sledeći igrač sa brojem poena koji već postoji u listi, npr: Pera:5500 - u tom slučaju se ne dodaje novi element 5500 => Pera već mi prepiše postojeći 5500 => Nemanja sa ovim novim 5500 => Pera, što je i logično, ali ja bih hteo da u ovom slučaju to ne radi tako.

Ili mi je možda pristup skroz pogrešan?

dee 28. 07. 2007. 15:49

ako vec mora bez baze, ja bih napravio

$lista = array("igrac1" => "bodovi1" , ... , "igracN" => "bodoviN")

pri upisu novog, sortiras polje po vrijednostima i provjeris je li mu rezultat manji od posljednjeg. ako je, ne ulazi u listu, ako nije, zadnjeg brises i dodajes novog.

ispis takodjer sortiras po vrijednostima.

Nemanja Avramović 28. 07. 2007. 15:53

Da, ali zar onda nije isti slučaj, ako se dodaje igrač sa istim imenom?

Recimo imam array('Avram'=>2200,'Nemanja'=>1350), ako dodam Nemanja=>9245, zar neće da prepiše ovog sa 1350 poena?

dee 28. 07. 2007. 16:02

ovisi koliko ljudi zelis drzat u hall of fame listi?

koliko ja shvacam, to je nesto kao recimo top 10 lista, gdje drzis 10 najboljih rezultata, jel tako?

u tom slucaju, moguce je da je 10 najboljih rezultata postigla samo igraca. u tom slucaju, lista ce bit npr.

Avram:10000
Avram:9000
Nemanja:8000
Avram:7000
Nemanja:6000
Nemanja:5000
Nemanja:4000
Avram:3000
Nemanja:2000
Avram:1000

u principu, ono sto je bitno jest da se pamte rezultati i da se prema njima kreira lista. korisnik koji ga je postigao je samo dodatna informacija.

sto znaci,

Citat:

Recimo imam array('Avram'=>2200,'Nemanja'=>1350), ako dodam Nemanja=>9245, zar neće da prepiše ovog sa 1350 poena?
u ovom slucaju ce ga prepisati ako u hall of fame zelis drzati maksimalno 2 rezultata. tad ce novi rezultat bit (9245) veci od najmanjeg (1350) i najmanji ce bit izbrisan a novi ubacen. neovisno o imenu igraca.
ako pak u hall of fame drzis npr. 10 najboljih rezultata i trenutno unutra imas samo dva (ko u prethodnom postu), skripta doda novi rezultat sa istim imenom igraca, znaci imat ces:

Nemanja:9245
Avram:2200
Nemanja 1350

ivanhoe 28. 07. 2007. 17:15

napravi nesto ovako:
PHP kôd:

$top_lista = array (
    [
0] => array ( 'ime' => 'pera''poeni' => 100 ),
    [
1] => array ( 'ime' => 'pera''poeni' => 200 ),
    [
2] => array ( 'ime' => 'zika''poeni' => 100 ),    
); 

i onda samo sortiraj taj niz po polju poeni (pomocu usort() recimo)

Nemanja Avramović 28. 07. 2007. 17:46

Hm, može mala pomoć?

Odradio sam ovako nešto (po ugledu na ono iz manuala):

PHP kôd:

//...
function sortirajme($a$b) {
    if (
$a['poeni'] == $b['poeni']) {
        return 
0;
    }
    return (
$a['poeni'] < $b['poeni']) ? -1;
}

$delovi explode(':',$element);
$imence $delovi[0];
$poencici $delovi[1];
$mojniz = array();
$br 0;
foreach (
$lista as $stavka) {
    
$p explode(':',$stavka);
    
$mojniz[$br] = array('ime'=>$p[0], 'poeni'=>$p[1]);
    
$br++;
}
$mojniz[$br] = array('ime'=>$imence'poeni'=>$poencici);
usort($mojniz,'sortirajme');
print_r($mojniz); 

Ono što dobijam je ovako nešto:

Kôd:

Array
(
    [0] => Array
        (
            [ime] => Avram
            [poeni] => 1000
        )

    [1] => Array
        (
            [ime] => Avram
            [poeni] => 10000

        )

    [2] => Array
        (
            [ime] => Avram
            [poeni] => 2000

        )

    [3] => Array
        (
            [ime] => Avram
            [poeni] => 3000

        )

    [4] => Array
        (
            [ime] => Avram
            [poeni] => 4000

        )

    [5] => Array
        (
            [ime] => Avram
            [poeni] => 5000

        )

    [6] => Array
        (
            [ime] => Nemanja
            [poeni] => 5200
        )

    [7] => Array
        (
            [ime] => Avram
            [poeni] => 6000

        )

    [8] => Array
        (
            [ime] => Avram
            [poeni] => 7000

        )

    [9] => Array
        (
            [ime] => Avram
            [poeni] => 8000

        )

    [10] => Array
        (
            [ime] => Avram
            [poeni] => 9000

        )

)

Znači on lepo uglavi ovih 5200 gde treba, ali ne ne kapiram zašto su 1000 i 10000 poena na prva dva mesta?

izmena: USPEO SAM! Samo treba u petlji i dole ispod da se doda (int)

PHP kôd:

foreach ($lista as $stavka) {
    
$p explode(':',$stavka);
    
$mojniz[$br] = array('ime'=>$p[0], 'poeni'=>(int)$p[1]);
    
$br++;
}
$mojniz[$br] = array('ime'=>$imence'poeni'=>(int)$poencici); 

Hvala ivanhoe ;)


Vreme je GMT +2. Trenutno vreme je 20:35.

Powered by vBulletin® Verzija 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright © DevProTalk. All Rights Reserved.

Mišljenja, saveti, izjave, ponude ili druge informacije ili sadržaji nastali na Sajtu su vlasništvo onoga ko ih je kreirao, a ne DevProTalk.com, tako da ne morate da se oslanjate na njih.
Autori poruka su jedini odgovorni za ovakve sadržaje. DevProTalk.com ne garantuje tačnost, kompletnost ili upotrebnu vrednost informacija, stavova, saveta ili datih izjava. Ne postoje uslovi pod kojima bi mi bili odgovorni za štetu ili gubitak koji je posledica bilo čijeg oslanjanja na nepouzdane informacije, ili bilo kakve informacije nastale kroz komunikaciju između registrovanih članova.
Web sajt može sadržavati linkove na druge web sajtove na Internetu ili neke druge sadržaje. Ne kontrolišemo niti podržavamo te druge web sajtove, niti smo pregledali bilo kakve sadržaje na takvim sajtovima. Mi nećemo biti odgovorni za legalnost, tačnost ili prikladnost bilo kog sadržaja, oglasa, proizvoda, usluga ili informacije lociranim na ili distribuiranih kroz druge web sajtove, niti za bilo kakvu štetu nastalu kao posledica takvih informacija. DevProTalk.com drži i čuva druga prava vlasništva na web sajtu. Web sajt sadrže materijale zaštićene copyright-om, zaštitne znakove i druge informacije o pravu vlasništva ili softver. Članovi mogu poslatu informacije zaštićene pravima vlasništva njihovih nosilaca i ona ostaju zaštićena bez obzira da li su oni koji prenose te informacije to naveli ili ne. Osim informacija koje su u javnom vlasništvu ili za koje dobijete dozvolu, nemate pravo da kopirate, modifikujete ili na bilo koji način menjate, objavljujete, prenosite, distribuirate, izvršavate, prikazujete ili prodajte bilo koju informaciju zaštićenu pravima vlasništva. Slanjem informacija ili sadržaja na bilo koji deo DevProTalk.com, Vi automatski dozvoljavate i predstavljate garanciju da imate pravo da dozvolite DevProTalk.com ili članovima DevProTalk.com bespovratnu, kontinualnu, neograničenu, globalnu dozvolu da koriste, kopiraju, izvršavaju, prikazuju i distribuiraju takve informacije i sadržaje i da iz takvih sadžaja koriste bilo koji deo u bilo koje svrhe, kao i pravo i dozvolu da koriste gore navedene sadržaje. Svi zaštitni znakovi (trademarks), logotipi, oznake usluga, firme ili imena proizvoda koji se pominju na ovom web sajtu su vlasništvo kojim raspolažu njihovi vlasnici.