Geburtstagreminder

Hi,

Du kannst bei Array.sort() eine sog. "Vergleichsfunktion" angeben, die jeweils zwei zu vergleichende Elemente des Arrays übergeben bekommt. Je nachdem, was die Funktion zurüvckgibt (-1, 0 oder 1), werden die Elemente unterschiedlich angeordnet.

Die Vergleichfunktion musst Du selbst schreiben (das ist meine "byDate").

Einfaches Beispiel: ich will ein Array aus Zahlen absteigend nach der Größe sortieren:
PHP:
var a = new Array(5, 9, 1, 0, 5, 1, 3, 4, 9, 8, 0);

a.sort(descending);

trace(a);

function descending(a, b) {
    if (a > b) {
        return -1;
    } else if (a < b) {
        return 1;
    } else {
        return 0;
    }
}
(probiers aus, ergibt 9,9,8,5,5,4,3,1,1,0,0)

Im Anhang nochmal die komplette Datei mit Sortierung.

Gruß
.
 

Anhänge

  • geburtstag.zip
    6,3 KB · Aufrufe: 16
Achso, das wird dann doch alle Namen durchsotiert.

Ich hab das nämlich mit dem d1,d2 und o1,o2 nicht so ganz verstanden! Ich check einfach das ganze nicht so:
PHP:
function byDate(o1, o2) { 
    var now = new Date(); 
    var d1 = new Date(now.getFullYear, parseInt(o1.monat, 10) - 1, parseInt(o1.tag, 10), now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds()); 
    var d2 = new Date(now.getFullYear, parseInt(o2.monat, 10) - 1, parseInt(o2.tag, 10), now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds()); 
    return ((d1 < d2)? -1 : 1); 
}

die funktion wird da aufgerufen, ein neue Date-Klasse mit dem namen now erstellt. dann wird d1 auch als neues Date - Klasse erstellt und bekommt als zusatz die Jahre, Monat,..... und bei d2 das gleiche. Das ganz wird verglichen und bekommt dann -1 oder 1.

Ok, aber was ich nicht so ganz versteht. in d1 und d1 werden ja nur das Jahr, Monat, tag, stunden, minuten, sekunden und millisecunden die jetzt gerade sind abgerufen. Und wie geht das, das es dann verglichen werden kann wenn beides das gleiche hat :confused:

und in entry.sort.... da wird dann einfach -1 oder 1 gespeichert oder wie. Das versteht ich nicht so ganz.


Aber eines muss ich jetzt schon sagen. Das hier ist ein wirklich gutes Forum und du kennst dich wirklich sehr gut aus mit Flash, in anderen Foren hätte ich die antwort bekommen, such doch im Forum, obwohl ich gesagt habe das ichs nicht versteh. Echt ein rießen Lob an dich.
 
Echt ein rießen Lob an dich.
Das ehrt mich natürlich, zumal ich es scheinbar nicht wirklich verständlich erklären kann. ^^

Also, neuer Versuch:
  • Die sort-Methode arbeitet, indem sie zwei Elemente des Arrays anhand einer selbst zu definierenden Vergleichsfunkion vertauscht. Das macht sie so lange mit allen Elementen, bis die richtige Reihenfolge erreicht ist.

  • Wir müssen nun eine Vergleichsfunktion schreiben, die entscheidet, nach welchen Kriterien zwei Elemente des Arrays "entry" vertauscht werden müssen.

  • Diese Vergleichsfunktion bekommt zwei Elemente des Arrays übergeben (das sind bei uns zwei Objekte mit den Eigenschaften, vorname, nachname, jahr, monat und tag). Wir wollen anhand des Datums sortieren, darum interessieren uns die Eigenschaften monat und tag (das Jahr spielt keine Rolle, da der Geburtstag ja jedes Jahr statt findet).

  • Was wir also machen, ist folgendes: Wir erstellen zwei Datumsobjekte (d1 und d2) mit dem Datumswert der beiden Geburtstage der übergebenen Elemente. Das machen wir genauso wie in der Ausgangsfunktion (siehe erstes Posting), indem wir das aktuelle Jahr (und auch Minuten, Sekunden usw.) verwenden, aber Monat und Tag aus dem jeweiligen entry-Objekt.

  • Nun schauen wir, welches Datumsobjekt kleiner ist (sprich: zeitlich früher liegt) und geben je nachdem -1 oder 1 zurück (ansonsten kann ich echt nur an die Referenz zu Array.sort() verweisen, die es sicher besser erklärt als ich - obwohl auch ich , wie ich zugebe, etwas gebraucht habe, bis ich es gepeilt hatte ^^)

Gruß
.
 
Naja aber jetzt Peil ichs endlich was das macht :)

nur :) (schon wieder mal), haut da was nicht ganz hin hab ich gesehen!! Ich hab noch meine Freundin hinzugefügt zur Liste, die hat am 26.09 Geburtstag!

Was ist es sieht nun so aus:

Freundin
Mutter
Ich

und sollte aber eigentlich so sein:

Mutter
Freundin
Ich


Ich weiß nicht was da schief geht, aber so wirds bei mir ausgegeben :)

Ps: das ist deswegen weil ich den Wert von 10 Tagen doch auf 20 geändert habe, deswegen wird auch jetzt mein Geburtstag schon angezeigt. Es ist auch bei deiner Datei, so habs auf 20 Tage geändert und hab meine Freundin hinzugefügt, da steht auch meine Freundin ganz oben!
 
Zuletzt bearbeitet:
Hi,

schreibs mal so:
Code:
function byDate(o1, o2) {
	var now = new Date();
	var d1 = new Date(now.getYear() + 1900, parseInt(o1.monat, 10) - 1, parseInt(o1.tag, 10), now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());
	var d2 = new Date(now.getYear() + 1900, parseInt(o2.monat, 10) - 1, parseInt(o2.tag, 10), now.getHours(), now.getMinutes(), now.getSeconds(), now.getMilliseconds());
	if (d1 < d2) {
		return -1;
	} else if (d1 > d2) {
		return 1;
	} else {
		return 0;
	}
}
(obwohl's mich grade etwas wundert, warum der trinäre Operator nicht funktioniert - naja, auch ich überseh mal was)

Gruß

EDIT: Der Fehler wird vermutlich damit zusammenhängen, dass die 0 als Rückgabewert bei Gleichheit nciht berücksichtige wird. Etwas seltsam:
Code:
return (d1 <= d2)? -1 : 1;
funktioniert. ;)
.
 
Zuletzt bearbeitet:
Juuuuuuhhhhhhhuuuuuuuuuu,

10000000 mal danke! Jetzt funktionierts endlich!!

Echt nochmal ein rießen Lob an dich, auch wenn ich ein bisschen schwer von Kapier bin.

Naja morgen werde ich mich dann mal machen, das man noch von Flash über PHP alles eintragen kann in die XML.

Denkst dir wahrscheinlich, toll da kommt schon wieder was auf mich zu :suspekt:

danke nochmal für deine Hilfe!

Ps: Der Smilie ist echt cool>>> :suspekt: :)
 
So nun bins ich wieder mit meinem reminder :)

Also ich hab einen Code für speichern leider wird dann alles was in der xml ist überschrieben und auch nicht richtig gespeichert!

So siehts nun nach dem Speichern aus dem Web aus die XML:
Code:
<daten /><reminder_info jahr=\"1988
\" monat=\"09
\" tag=\"23
\" nachname=\"Musterman
\" vorname=\"Max\" />

Du kennst ja meine XML datei wie sie aussieht! Ja und so sollte es eigentlich "hinzugefügt" werden zur bereits bestehenden xmldatei.

Das ist der Code in Flash:
PHP:
var xmlsend = new XML();

var xmlroot = xmlsend.createElement("daten");
xmlsend.appendChild(xmlroot)

var xmlNode = xmlsend.createElement("reminder_info");
xmlNode.attributes.vorname = vo.text;
xmlNode.attributes.nachname = na.text;
xmlNode.attributes.tag = ta.text;
xmlNode.attributes.monat = mo.text;
xmlNode.attributes.jahr = ja.text;
xmlsend.appendChild(xmlNode);

var phpSendXml = new LoadVars();
phpSendXml.xmlString = xmlsend.toString();
phpSendXml.send("reminder.php?remin="+random(9999999),phpSendXml,"POST")

und die php datei die mir das ganze abspeichert:
PHP:
<?php
$file="reminder.xml";
$newfile = fopen($file, "w");
$add = $xmlString;
fwrite($newfile, $add);
fopen($newfile);
?>

Hoffe du kannst mir da auch noch erklähren wie das funktioniert das es richtig hinzugefügt wird
 
Hi,

probiers mal mit:
PHP:
phpSendXml.xmlString = escape(xmlsend.toString());
und dann in PHP:
PHP:
$add = urldecode($xmlString);

Alternativ sollte in PHP auch schon ein:
PHP:
$add = stripslashes($xmlString);
genügen.

Gruß
.
 
Also wenn ichs mit dem mach:
PHP:
$add = urldecode($xmlString);

siehst so aus:
Code:
<daten /><reminder_info jahr="1988
1988" monat="09
" tag="29
" nachname="Musterman
" vorname="Max
" />

und beim 2 vorschlage siehst so aus:
Code:
%3Cdaten%20%2F%3E%3Creminder%5Finfo%20jahr%3D%22jahr%0D%22%20monat%3D%22monat%0D%22%20tag%3D%22tag%0D%22%20nachname%3D%22Nachname%0D%22%20vorname%3D%22Vorname%0D%22%20%2F%3E

und es wir wie man sieht beim 2 hinzugefügt aber beim ersten nicht.

Hoffe du kannst mir da helfen :confused:
 
Hi,

irgendwas hast Du falsch gemacht.

Folgendes funktioniert:
PHP:
// Flash-Code:
var phpSendXml = new LoadVars();
phpSendXml.xmlString = xmlsend.toString();
phpSendXml.sendAndLoad("reminder.php?remin="+random(9999999),phpSendXml,"POST");
mit diesem PHP-Code:
PHP:
$add = stripslashes($xmlString);
(allerdings nur, wenn register_globals auf "on" steht, sonst musst Du $_POST["xmlString"]; verwenden)

Alternativ funktioniert auch dieses:
PHP:
// Flash-Code:
var phpSendXml = new LoadVars();
phpSendXml.xmlString = escape(xmlsend.toString());
phpSendXml.sendAndLoad("reminder.php?remin="+random(9999999),phpSendXml,"POST");
mit diesem PHP-Code:
PHP:
$add = urldecode($xmlString);

Gruß
.
 

Neue Beiträge

Zurück