 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, Deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
21.03.2005, 13:58
|
#1
|
|
TP-Senior
Registriert seit: Nov 2004
|
schnittmenge von 2 arrays aus dem einen löschen
Hallo, hab nochmal so'n schwer zu beschreibendes Problem...
Habe 2 zweidimensonale Arrays und möchte die einzelnen Einträge miteinander verbinden, so ala Tischtennisturnier "jeder mit jedem".
Wenn die Einträge nur in Array1 oder Array2 sind ist alles ok, dann krieg ich das mit zwei verschachtelten for-Schleifen hin.
Nur, wenn nicht, wie krieg ich dann die Duplikate raus? Schnittmenge bilden und die gefundenen aus dem einen Array löschen? Nur wie?
Schnittmenge hab ich schonmal dies gefunden:
PHP-Code:
$result = array_intersect($arr1, $arr2);
Nur wie krieg ichs gelöscht, kenne bisher nur slice und pop...
Wär toll, wenn mir noch mal jemand auf die Sprünge helfen könnte.
Viele Grüße
Jackie
|
|
|
21.03.2005, 14:06
|
#2
|
|
TP-Junior
Registriert seit: Oct 2004
|
Hmm, weiss zwar nicht ob das so klappt, aber du könntest ja versuchen die beiden arrays mit array_merge() zusammenführen und dann per array_unique() die doppelten Einträge entfernen.
|
|
|
21.03.2005, 14:15
|
#3
|
|
TP-Moderator
Registriert seit: Jan 2005
Ort: Düsseldorf
|
Das mit den doppelten Einträgen ist so eine Sache, vor Ewigkeiten hab ich mal so ein Lottozahlen Script gebastelt, 6 aus 49, vom Grundproblem her ist es ähnlich, ich checke einfach, ob das Ergebnis im Ergebnis array schon drin ist doer nicht, wenn ja dann zieh ich halt nochmal.
Vielleicht nutzt es dir ein wenig,
so long,
skip
PHP-Code:
session_start();
include("datnebankverbindungsgedoense.php");
$query = "Select count(*) from gewinner";
$result = mysql_query($query);
$anzahl = mysql_result($result,0);
$alle_nehmen = "Select spieler_id from gewinner";
$alle_kriegen = mysql_query($alle_nehmen);
function zufalls_zahlen($n, $x, $y) {
// n Zahlen aus dem Bereich x bis y
mt_srand((double)microtime()*1000000);
$pool = range($x, $y);
for($i=0; $i<$n; $i++) {
$number = mt_rand($x, $y);
while(!in_array($number, $pool)) {
$number = mt_rand($x, $y);
}
$ergebnis[] = $number;
list($key) = array_keys($pool, $number);
unset($pool[$key]);
}
return $ergebnis;
}
if($gewinner<$anzahl){
$lottozahlen = zufalls_zahlen($gewinner, 1, $anzahl);
shuffle($lottozahlen);
__________________
Chenaski - Klamotten designed by Pete
USE - nicht immer nur mit Stars and Stripes rumlaufen!
Hunde in der Großstadt: Guck mal wo ich fast reingetreten bin.....
|
|
|
21.03.2005, 14:16
|
#4
|
|
TP-Senior
Registriert seit: Nov 2004
|
@magadoo:
hmmm... und wie mach mit dem einen Array dann das "jeder mit jedem"?
Geändert von jackie_o (21.03.2005 um 14:42 Uhr).
|
|
|
21.03.2005, 15:57
|
#5
|
|
TP-Junior
Registriert seit: Oct 2004
|
Tja, das ist die andere Frage
Aber du könntest ja wie du selber gesagt hast, mit zwei Schleifen beide arrays verknüpfen und vor jedem Durchlauf den behandelten Eintrag aus dem zweiten array löschen
|
|
|
22.03.2005, 10:19
|
#6
|
|
TP-Moderator
Registriert seit: Jan 2005
Ort: Düsseldorf
|
Eben,
schau dir das mal in Ruhe an. Die Idee ist ja die gleiche,
unset($pool[$key]);
Ein korrekt gezogener Wert wird aus dem "pool" der zu verarbeitenden Zahlen gezogen, der pool ist quasi die große Kugel, in der die Lottokugeln rumeinern, wenn eine gezogen ist, ist sie nicht mehr drin..........
So machst du das , mit deinen Tischtennis - Spielern auch und schon sind Doppelziehungen nicht mehr möglich.
so long,
skip
__________________
Chenaski - Klamotten designed by Pete
USE - nicht immer nur mit Stars and Stripes rumlaufen!
Hunde in der Großstadt: Guck mal wo ich fast reingetreten bin.....
|
|
|
22.03.2005, 10:26
|
#7
|
|
TP-Moderator
Registriert seit: Jan 2005
Ort: Düsseldorf
|
Ach ja,
jeder mit jedem.
Anzahl der Begegnungen bei n Spielern = n x (n-1)
also 10 Spieler, jeder kann gegen 9 andere spielen, macht 90 Spiele.
20 Spieler, jeder 19 Begegnungen, 380 Spiele, das wäre ein verdammt langes Turnier
so long,
skip
__________________
Chenaski - Klamotten designed by Pete
USE - nicht immer nur mit Stars and Stripes rumlaufen!
Hunde in der Großstadt: Guck mal wo ich fast reingetreten bin.....
|
|
|
23.03.2005, 09:59
|
#8
|
|
TP-Senior
Registriert seit: Nov 2004
|
@skipperjan: danke für deine posts, aber ich krieg dein Beispiel leider nicht so ganz mit meinem "problem" zusammen.
in meinem Fall ist es so, dass ein benutzer mittels zweier input-felder, was aus der DB holt. Die Ergebnisse aus input_a kommen in Array_a, die Ergebnisse aus input_b in Array_b. Und davon soll dann jeder aus Array_a mit jedem aus Array_b. (Sind nicht so viele, max. 5 pro Array).
Gleiche Eingaben werden rausgefiltert, aber da man nur (mind.) die ersten 3 zeichen eingeben muss, ergibt eine Eingabe von "joh" und "joha" doppelte in beiden Arrs. (z.B. a: johannes, johann, john b:johannes, johann).
Das keiner mit sich selbst spielen muss hab ich geregelt.
Nur das "johannes vs. johann" das gleiche ist wie "johann vs. johannes" und deshalb raus muss, krieg ich leider nicht hin.
Also wenn da noch jemand ne Idee hat...
Falls nicht, is auch nicht soo schlimm, hat der user der so beknackte eingaben macht halt pech und muss sich die hälfte wegdenken [obwohl, schöner wärs anders schon  ]
Vielen Dank und Gruß
Jackie
|
|
|
23.03.2005, 10:23
|
#9
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
Ich habe das mal für Snooker-Spiele realisiert, und da habe ich eine Tabelle benutzt, wo nur die Spieldaten drin sind:
SpielID int 4 NOT NULL auto_increment NULL
Datum date NOT NULL '0000-00-00' NULL
Turnier int 4 NOT NULL '0' NULL
Liga int 4 NOT NULL '0' NULL
Tisch int 11 NOT NULL '0' NULL
Spieler1 int 4 NULL NULL
Spieler2 int 4 NULL NULL
Punkte1 int 2 NOT NULL '0' NULL
Punkte2 int 2 NOT NULL '0' NULL
Highbreak1 int 4 NOT NULL '0' NULL
Highbreak2 int 4 NOT NULL '0' NULL
Modus int 2 NOT NULL '0' NULL
d1 int 2 NOT NULL '0' NULL
d2 int 2 NOT NULL '0' NULL
d1 und d2 sind Ratings vor dem Spiel, um auch wieder den Zustand vor dem Spiel herstellen zu können.
Anhand dieser Tabelle kann man mit geschickten SELECT sich alle erwünschten Infos rausziehen. Die Spielerdaten werden dann einfach per JOIN eingebunden.
Ich habe seinerseits auch ziemlich lange fran rumgeknappst - das schlimmste war die Erstellung von Turnieren in Baumstruktur 
|
|
|
23.03.2005, 11:19
|
#10
|
|
TP-Moderator
Registriert seit: Jan 2005
Ort: Düsseldorf
|
So wie ich Jackie jetzt verstehe, ist alles fertig, nur es fehlt dir ein Instrument, Dopplungen zu verhindern, wenn jemand in beide Felder das gleiche einträgt?
War es dass?
Nun, die Lösung ist, jemanden der bereits in array a drinsteht nicht mehr in array b reinzulassen. du kannst ja vo jedem Eintrag einfach prüfen, ob genau dieser Spieler schon in einem der arrays drinsteht.
Dann brauchst du das später auch nicht rauszufiltern.
Sind deine Spielergruppen eigentlich immer gleich groß? Es gibt ja drei Fälle zu berücksichtigen, a = b, a > b, a < b............
so long,
skip
__________________
Chenaski - Klamotten designed by Pete
USE - nicht immer nur mit Stars and Stripes rumlaufen!
Hunde in der Großstadt: Guck mal wo ich fast reingetreten bin.....
|
|
|
23.03.2005, 11:22
|
#11
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
Wenn man wie gesagt die SELECTs geschickt setzt, kann man doch schon viel Vorarbeit leisten. Dazu müsste man sehen, wie die Tabellen sind, die jetzige SQL-Abfrage und was genau drinmstehen soll.
|
|
|
23.03.2005, 12:03
|
#12
|
|
TP-Senior
Registriert seit: Nov 2004
|
ja skipperjan sieht das schon ganz richtig
gruppen können alle 3 fälle haben (a = b, a > b, a < b)
beim einlesen der GET-variablen ins array_b vorher fragen, ob schon in array_b vorhanden klingt gut, muss ich mal probieren, ob ichs hinkriege
@St@eff.en
hab nur eine einzige tabelle mit allen "spielern", abgefragt wird nur input_a und input_b und dann sollen die entsprechenden Paare gebildet werden.
Is eigentlich auch nur ein Experiment und das mit den Turnierspielern um das ganze etwas weniger abstarkt zu machen. Es geht aber nur um die Paarbildung.
Vielleicht wird irgendwann mal ein Spiel draus, wenn ich groß bin
Gruß Jackie
|
|
|
23.03.2005, 12:10
|
#13
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
na dann kann ich nur sagen - viel Spass beim Zähneausbeissen
Ich habe das seinerzeit so gelöst, das ich 2 mal dieselbe Tabelle geJOINt habe, sieht halt nicht sehr übersichtlich aus, aber erfüllte den Zweck
SELECT snooker_spiele.SpielID, snooker_spiele.Datum, snooker_spiele.Turnier, snooker_spiele.Liga, snooker_user.username AS S1, snooker_user_1.username AS S2, snooker_spiele.Punkte1, snooker_spiele.Punkte2, snooker_spiele.HighBreak1, snooker_spiele.HighBreak2, snooker_spielmodi.Spielmodus, snooker_spiele.Spieler1, snooker_spiele.Spieler2 FROM ( snooker_spiele INNER JOIN snooker_user ON snooker_spiele.Spieler1 = snooker_user.UserID ) INNER JOIN snooker_user AS snooker_user_1 ON snooker_spiele.Spieler2 = snooker_user_1.UserID INNER JOIN snooker_spielmodi On snooker_spiele.Modus = snooker_spielmodi.SpielmodusID
aber das sieht bei Dir sicher anders aus, vielleicht ist es ja einen Gedanken wert ...
|
|
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
Thema durchsuchen |
|
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:05 Uhr.
|
 |