Autor Zpráva
keeehi
Profil
mám takovéto pole:
Array
(
[0] => Array
(
[0] => Jan
[1] => Novák
[2] => 1700
)

[1] => Array
(
[0] => Tomáš
[1] => Novák
[2] => 1701
)

[2] => Array
(
[0] => Jan
[1] => Horák
[2] => 1699
)

)

a potřebuji ho seřadit sestupně podle dvojky (to číslo), v případě rovnosti vzestupně podle příjmení, v případě rovnosti podle jména

k řazení používám usort a vlastní funkci
function manysort($a,$b){
  if($a[2]==$b[2]){
    if (strcasecmp($a[1],$b[1])==0){
      if (strcasecmp($a[0],$b[0])==0)
        return 0;
      else
        return strcasecmp($a[0],$b[0]);
    }
    else
      return strcasecmp($a[1],$b[1]);
  }
  elseif($a[1] < $b[1])
    return 1;
  else
    return -1;
}

usort($pole, 'manysort');
print_r($pole);


Potřeboval bych poradit, kde dělám chybu, protože si to řadí jak chce, někdy je to seřazené dobře, jindy ne. Dokud jsem to řadil pouze podle toho čísla, a v případě shody jsem se dál s tím už nezabýval, tak to fungovalo v pořádku.
Nebo znáte nějaké řešení, jak toto dvourozměrné pole seřadit efektivněji?

Děkuji za odpovědi
tiso
Profil
keeehi: a to viacrozmerné pole si získal ako?
keeehi
Profil
tiso:
Získané je z databáze, ale není to jedno, odkud je?
Alphard
Profil
keeehi:
Získané je z databáze, ale není to jedno, odkud je?
Není, v databázi to půjde pravděpodobně seřadit lépe. Jakým dotazem to taháte?
keeehi
Profil
Alphard:
Za něj se spíše stydím. Na vině je jistě špatně navržená struktura databáze, ale lépe jsem to prostě nevymyslel.
kód na vytvoření pole z DB bypadá takto:
$dotaz = "SELECT idhrace,jmeno,prijmeni FROM hraci;";
$vysledek = mysql_query($dotaz, $link) or die ("SQL dotaz nešlo provést ř: 133");
while (list($idhrace,$jmeno,$prijmeni) = mysql_fetch_row($vysledek))
{
$tabulka[$idhrace][0] = $jmeno;
$tabulka[$idhrace][1] = $prijmeni;
}

$dotaz = "SELECT idhracea,idhraceb,vysledek FROM partie;";
$vysledek = mysql_query($dotaz, $link) or die ("SQL dotaz nešlo provést ř: 133");
while (list($idhracea,$idhraceb,$skore) = mysql_fetch_row($vysledek))
{
$tabulka[$idhracea][(6-$skore)]++;
$tabulka[$idhraceb][(4+$skore)]++;
}

for($i=1;$i<=$pocethracu;$i++)
{
$dotaz = "SELECT elo FROM elo WHERE idhrace=$i ORDER BY znamka desc LIMIT 1;";
$vysledek = mysql_query($dotaz, $link) or die ("SQL dotaz nešlo provést ř: 133");
$tabulka[$i][2] = mysql_result($vysledek,0);
}

$dotaz = "SELECT idhrace,max(elo) FROM elo GROUP BY idhrace;";
$vysledek = mysql_query($dotaz, $link) or die ("SQL dotaz nešlo provést ř: 133");
while (list($idhrace,$maxelo) = mysql_fetch_row($vysledek))
{
$tabulka[$idhrace][3] = $maxelo;
}



databáze vypadá takto:
elo

Sloupec	Typ	Nulový	Výchozí
idelo	mediumint(8)	Ne		
idhrace	tinyint(3)	Ne		
elo	smallint(5)	Ne		
datum	date	Ne		
znamka	timestamp	Ne	CURRENT_TIMESTAMP	


hraci

Sloupec	Typ	Nulový	Výchozí
idhrace	tinyint(3)	Ne		
jmeno	varchar(50)	Ne		
prijmeni	varchar(50)	Ne		


partie

Sloupec	Typ	Nulový	Výchozí
idpartie	mediumint(8)	Ne		
idhracea	tinyint(3)	Ne		
idhraceb	tinyint(3)	Ne		
vysledek	smallint(1)	Ne
tiso
Profil
keeehi: „Za něj se spíše stydím. Na vině je jistě špatně navržená struktura databáze, ale lépe jsem to prostě nevymyslel.
To je o dôvod viac, prečo začať práve tam.
Otázka znie, čo vlastne potrebuješ z databázy vypisovať, podľa toho sa upraví štruktúra tabuliek.
Pre začiatok môže začať s lepšími názvami stĺpcov:
games(id, white_id, black_id, score)
keeehi
Profil
Dobře, v tom případě bych potřeboval pomoct s návrhem databáze potřeboval bych v ní mít uložené jméno a příjmení hráče, potom partie (hráčA, hráčB, výsledek, datum) pro další statistiky (jak spolu nějací dva hráči postupně hráli) a nakonec ela - momentální elo, maximální elo, ale i ta předešlá ela s datumy, aby se mohl z něčeho tvořit graf, jak se daný hráč vyvíjel

budou teda 3 typy výstupů
- tabulka všech hráčů obsahující: pořadí, jméno, příjmení,aktuální elo, maximální elo, počat výher, počet proher, počet remíz
- graf hráče - osa x datum, osa y elo
- tabulka vzájemných zápasů dvou hráčů: hráčA, hráčB, výsledek, datum

vstup - hracA, hracB, výsledek, datum
elo chci počítat po každé partii -> jeden vstup = změna ela u dvou hráčů


Děkuji za pomoc
tiso
Profil
normalizovaná forma:
players(id,firstname,lastname)
games(id, white_id, black_id, score, date_end)
elo(id,player_id,elo,date_when)


po denormalizácii:
players(id,firstname,lastname,actual_elo,max_elo,win_num,loss_num,draw_num)
games(id, white_id, black_id, score, date_end)
elo(id,player_id,elo,date_when)

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: