kombinacie v php

Programovacie jazyky, rady, poradňa...
crusty
Novice
Novice
Príspevky: 9
Registrovaný: 11 sep 2008, 12:02

kombinacie v php

Príspevok od používateľa crusty »

Potreboval by som zostavit nejaky jednoduchsi skript na kombinaciu dvojic, napriklad:
Mam cisla: 5,8,13
Potrebujem zostavit dvojice, takym systemom aby bolo kazde cislo raz prve z dvojice a raz druhe.
Teda:
  • 5 - 8
    8 - 5
    5-13
    13-5
a tak dalej
(nemozu byt 2 rovnake cisla v dvojici)


Vyriesil som to zatial tak, ze som si z databazy vybral cisla s ktorymi budem pracovat. Dal som ich do Array, a potom pomocou cyklu for zostavil tieto dvojice.

Poslednu vec vsak neviem spravit. Teraz mi to sice zoradi vsetky dvojice, ale neviem si tieto dvojice usporiadat ako chcem.
Potreboval by som to nejak takto:

5-8
8-13
13-5

8-5
13-8
5-13

Proste aby najskor (akokeby v prvej polovici procesu zostavovania dvojic) zostavilo vsetky mozne dvojice a v druhej polovici tie iste dvojice ale v prehodenom poradi t.z. 5-8 by bolo 8-5. Aby to malo tento system...
Vedel by niekto ako jednoducho na to?
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

a ako máš robené tie dvojice? To "8-5" je reťazec, alebo dva prvky pola? A tieto dvojice sú samostatné premenné alebo je to tiež celé v poli? (teda $pole[cislo_dvojice][prve_cislo][druhe_cislo] )?
crusty
Novice
Novice
Príspevky: 9
Registrovaný: 11 sep 2008, 12:02

Príspevok od používateľa crusty »

kazde cislo je samostatny prvok, tie dvojice som pozeral zatial len v echu, mam to takto:

Kód: Vybrať všetko

$result=mysql_query("SELECT  * FROM users order by id");
$rad=array();
while($row=mysql_fetch_array($result)) {
$rad[]=$row[id];
}
for ($a=0;$a<count($rad);$a++) {
 for($i=0;$i<count($rad);$i++) {
 if($rad[$a]!=$rad[$i]) echo "<br /> $rad[$a]  - $rad[$i]";
 }
}
neviem, ako by sa to dalo jednoduchsie spravit...
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Príspevok od používateľa audiotrack »

ale podla tvojej požiadavky:
zostavilo vsetky mozne dvojice a v druhej polovici tie iste dvojice ale v prehodenom poradi
tam budeš mať každú dvojicu 2x. Tak ako to máš teraz ten výstup nebude taký ako si dal príklad, ale taký ako chceš (alebo si myslím že chceš, a preto nechápem čo tam potrebuješ prerábať). Ak to ale naozaj potrebuješ každú dvojicu 2x, tak to iba pridaj do toho výpisu opačné poradie:

Kód: Vybrať všetko

 if($rad[$a]!=$rad[$i]){
 echo "<br /> $rad[$a]  - $rad[$i]"; 
echo "<br /> $rad[$i]  - $rad[$a]";
};
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Pravdepodobne ide o nejakú ligu. Takže potrebuje, aby tam bol "odvetný" zápas (rovnaké poradie zápasov, akurát sú hráči vymenený).
Najjednoduchšie riešenie bude asi to s tým poľom.

Kód: Vybrať všetko

<?php

$a = array(5, 8, 13, 27);
$d = array();

for ($i = 0; $i < count($a) - 1; $i++) {
	for ($j = $i+1; $j < count($a); $j++) {
		$d[] = array($a[$i], $a[$j]);
	}
}

foreach ($d as $item) echo $item[0] . " - " . $item[1] . "<br>";
foreach ($d as $item) echo $item[1] . " - " . $item[0] . "<br>";
?>
crusty
Novice
Novice
Príspevky: 9
Registrovaný: 11 sep 2008, 12:02

Príspevok od používateľa crusty »

Hej, bude to pre ligu. Taketo nieco som myslel, akurat este ta posledna vec, ze by to zoradilo nie takto ako je to teraz:
  • 5 - 8
    5 - 13

    5 - 27
    8 - 13

    8 - 27
    13 - 27

    8 - 5
    13 - 5

    27 - 5
    13 - 8

    27 - 8
    27 - 13
ale asi nejak takto (aby dvojice pod sebou boli 4 rozne cisla, budu to vlastne kola oddelene medzerou, tak tam vzdy musia byt rozlicni hraci):
  • 5 - 8
    13 - 27

    5 - 13
    8 - 27

    5 - 27
    8 - 13


    8 - 5
    27 - 13

    13 - 5
    27 - 8

    27 - 5
    13 - 8




//autoeditácia príspevku ( 31 Jan 2009, 14:04 )
...alebo aspon nejaky sposob, aby som po vygenerovani tych zapasov dokazal vyselektovat jednotlive dvojice do kol. Nejak to rozdelit aby sa z toho dali vytvorit zapasy oddelene kolom...
Proste neodohra sa to vsetko v jeden den, ale postupne. A takisto v jeden sa moze vyskytovat v kombinaciach iba jedno cislo(id)...(najlepsie raz doma a dalsie kolo vonku)
Neviem ako sa to robi inde...(generovanie zapasov v realnych sutaziach...tak aby sa to nemuselo pocitat rucne)
chrono
VIP
VIP
Používateľov profilový obrázok
Príspevky: 7127
Registrovaný: 25 dec 2006, 15:17

Príspevok od používateľa chrono »

Mohol by si sa rozhodnúť, čo vlastne chceš? Vygenerovanie kôl a štvoríc sa musí urobiť úplne inak, takže ak to niekto urobí a ty si to potom rozmyslíš, predpokladám, že budeš mať smolu. :)

Každopádne tu sú kolá. Ak to budeš chcieť prerobiť na štvorice, budeme sa musieť dohodnúť na cene. ;)

Kód: Vybrať všetko

<?php

$players = array(
	array('id' => 5, 'name' => "hrac 1"),
	array('id' => 8, 'name' => "hrac 2"),
	array('id' => 13, 'name' => "hrac 3"),
	array('id' => 27, 'name' => "hrac 4"),
	array('id' => 28, 'name' => "hrac 5"),
	array('id' => 36, 'name' => "hrac 6"),
	array('id' => 39, 'name' => "hrac 7")/*,
	array('id' => 40, 'name' => "hrac 8")*/);

if (count($players) % 2 != 0) array_push($players, array('id' => 0));
$players_count = count($players);
$matches_per_round = (int)($players_count / 2);
$rounds_count = $matches_per_round * 2 - 1;
$rounds = array();

for ($i = 0; $i < $rounds_count; $i++) {
	$round = array();
	for ($j = 0; $j < $matches_per_round-1; $j++) {
		$p1 = $i+(2*$j+1);
		if($p1 >= $players_count - 1) $p1 = $p1-$rounds_count;
		$p2 = $i-2*$j - 1;
		if ($p2 < 0) $p2 = $p2 + $rounds_count;
		$round[] = array($p1, $p2);
	}
	$round[] = array($i, $players_count - 1);
	$rounds[] = $round;
}

echo "Pocet kol: 2x", $rounds_count, "<br>\nPocet zapasov v kole: ", $matches_per_round, "<br>\n";

for ($i = 0; $i < count($rounds); $i++) {
	echo "<h2>" . ($i+1) . ". kolo</h2>\n";
	foreach ($rounds[$i] as $match) {
		if ($players[$match[0]]['id'] == 0) {
			echo $players[$match[1]]['name'], "<br>";
		} else if ($players[$match[1]]['id'] == 0) {
			echo $players[$match[0]]['name'], "<br>";
		} else {
			echo $players[$match[0]]['name'], " - ", $players[$match[1]]['name'], "<br>";
		}
	}
}
echo "<h1>Odvety</h1>\n";
for ($i = 0; $i < count($rounds); $i++) {
	echo "<h2>" . ($i+1) . ". kolo</h2>\n";
	foreach ($rounds[$i] as $match) {
		if ($players[$match[0]]['id'] == 0) {
			echo $players[$match[1]]['name'], "<br>";
		} else if ($players[$match[1]]['id'] == 0) {
			echo $players[$match[0]]['name'], "<br>";
		} else {
			echo $players[$match[1]]['name'], " - ", $players[$match[0]]['name'], "<br>";
		}
	}
}
?>

Ber to tak, že je to len polotovar. Budeš to musieť upraviť podľa toho, ako ti funguje tá tvoja stránka (a teda, možno tam budeš potrebovať tabuľku, kam si to rozlosovanie uložíš a teda sa ten algoritmus bude musieť mierne zmeniť...).
crusty
Novice
Novice
Príspevky: 9
Registrovaný: 11 sep 2008, 12:02

Príspevok od používateľa crusty »

Presne toto som potreboval, dost si mi pomohol, vazne dik :)

Tie stvorice som dal len ako priklad, aby bolo jasnejsie ako asi to ma fungovat.
To spracovanie si uz spravim, potreboval som hlavne ten algoritmus.
Inak ako dlho pracujes s PHP, ked sa mozem spytat?
Napísať odpoveď