php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2007

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 30.07.2007, 21:43  
Benutzer
 
Registriert seit: 14.02.2006
Beiträge: 49
webazubi
Standard Ist das ein Array und wie sortiere ich das?

Hallo. Ich habe über mehrere Abfragen, Schleifen und anderem am Ende ein Array (denke ich zumindest), das über var_dump folgendermaßen aussieht (siehe unten):
Ist das nun 1 Array oder 3 verschiedene? Auf jeden Fall hat jedes verschiedene Werte und ich möchte nun nach der Spalte [0] bzw. string(8) sortieren.
Leider bewirken die Sortierungsmethoden usort oder ksort gar nichts, wahrscheinlich weil das Array mehrfach geschrieben wird und jedesmal nur mit einem Wert sortiert.
Wie kann ich daher aus diesen Arrays ein gemeinsames machen, dass ich dann auch sortieren kann?
Danke

var_dump ($ergebnis);

array(3)
{
[0]=> string(8) "20070805"
[1]=> string(19) "05.08.2007"
[2]=> string(78) "Termin1"
}

array(3)
{
[0]=> string(8) "20070803"
[1]=> string(19) "03.08.2007"
[2]=> string(25) "Termin2"
}

array(3)
{
[0]=> string(8) "20070809"
[1]=> string(19) "09.08.2007"
[2]=> string(10) "Termin3"
}
webazubi ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 30.07.2007, 21:48  
Erfahrener Benutzer
 
Registriert seit: 13.08.2007
Beiträge: 1.976
KingCrunch befindet sich auf einem aufstrebenden Ast
KingCrunch eine Nachricht über ICQ schicken KingCrunch eine Nachricht über AIM schicken KingCrunch eine Nachricht über MSN schicken KingCrunch eine Nachricht über Yahoo! schicken
Standard

Was da ausgegeben wird, sind 3 verschiedene Arrays. Was du da sortierst, ist mir schleiferhaft. Wie wärs mal mit Code (und es gibt auch die BBCode-Tags [php] und [code] )
__________________
Nicht jeder Fehler ist ein Bug.
KingCrunch ist offline  
Alt 30.07.2007, 22:43  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Genau. Poste mal bitte etwas Code, wie das Array erzeugt wird und evl. auch, wie es später weiter verarbeitet werden soll.
nikosch ist offline  
Alt 30.07.2007, 23:15  
Benutzer
 
Registriert seit: 14.02.2006
Beiträge: 49
webazubi
Standard

Zitat:
Zitat von KingCrunch
Was da ausgegeben wird, sind 3 verschiedene Arrays.
Und die kann ich nicht zusammenbasteln? Die merge-Funktion setzt voraus, dass die Arrays wenigstens unterschiedliche Namen haben, was meine nicht haben.
Zitat:
Zitat von KingCrunch
(und es gibt auch die BBCode-Tags [php] und [code] )
Sorry, klappte nicht, jetzt auch nur wenn ich die Zeichen kopiere

Aber hier mein Weg.
1. SQL-Abfrage, die unter anderem alle Termintitel (T_TITEL) und einen Intervalltyp T_INTERVALL ausgibt
2. In einer for-Schleife werden alle Werte ausgegeben
3. Danach bzw. in dieser for-Schleife wird der Intervalltyp untersucht (if T_INTERVALL=1 Dann ...)
4. Es folgt eine while-Schleife, die eine Datumsaddition macht

Code:
while (count($termine) < $anzahl)
			 {
			  $datumarray = getdate($datum);
			  if ($datumarray["yday"] == $heutearray["yday"] && $datumarray["year"] == $heutearray["year"])
			      $termine[] = $heuteText;
			  elseif ($datum > $heute) $termine[] = formatAusgabexy($datumarray);
			  $datum = mktime(0,0,0,$datumarray["mon"],$datumarray["mday"]+$intervall + $z_dauerx - 1,$datumarray["year"]);
			 }
			 $datergo = "<tt>".join("
",$termine)."</tt>";		
		 $x_jahr = substr($datergo_sort1,-4) ;
		 $x_monat = substr($datergo_sort1,3,2) ;
		 $x_tag = substr($datergo_sort1,0,2) ;
		 $datergo_sort = $x_jahr . $x_monat . $x_tag;
5. Es folgen weitere Überprüfungen des Intervalltyps (if T_INTERVALL=2 Dann ...).
Bei unterschiedlichen Intervalltypen werden unterschiedliche Berechnungen mit dem Datum unternommen.

6. Am Ende der If-Intervallprüfungen sage ich
$datergo = array(
'T_TITEL' => $z_titel,
'T_SORT' => $datergo_sort
);

wobei T_TITEL aus der ersten SQL-Abfrage kommt und T_SORT durch die IF-Abfragen neu berechnet werden.
webazubi ist offline  
Alt 30.07.2007, 23:22  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Schön.

Und wo ist jetzt der Bezug zur obigen Frage? $ergebnis kann ich jedenfalls nicht entdecken. Auch keine Arrayzuweisung, die dem obigen Dump entsprechen könnte...
nikosch ist offline  
Alt 30.07.2007, 23:42  
Benutzer
 
Registriert seit: 14.02.2006
Beiträge: 49
webazubi
Standard

Zitat:
Zitat von nikosch77
Schön.

Und wo ist jetzt der Bezug zur obigen Frage? $ergebnis kann ich jedenfalls nicht entdecken. Auch keine Arrayzuweisung, die dem obigen Dump entsprechen könnte...
$datergo sollte es sein. Wenn ich das als var_dump ausgebe kmmen diese anfangs beschrieben Ergebnisse raus.
Ich versuche mal die Arrays neu und anders aufzubauen, vielleicht wird es (mir) dann klarer.
Aber dennoch die Frage: Gibt es nicht die Möglichkeit, die ganz oben zitierte Ausgabe von var_dump in ein neues Array zu schreiben? Offenbar wird der Befehl var_dump x Mal ausgeführt (je nachdem wieviel Ergebnisse die SQL-Abfrage brachte) und schreibt x Mal das Ergebnis hin. Ich bräuchte aber genau dieses Ergebnis an dieser Stelle in einem Array.
webazubi ist offline  
Alt 31.07.2007, 00:13  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse:
Fortgeschritten
nikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunftnikosch hat eine strahlende Zukunft
Standard

Wenn Du am Ende diese Zuweisung machst:
PHP-Code:
<?
 $datergo 
= array(
'T_TITEL' => $z_titel,
'T_SORT' => $datergo_sort
);
(siehe, auch BBCode funktioniert), wird mit Sicherheit
  • 1.) kein numerisches Array herauskommen, sondern ein assoziatives mit
    T_TITEL und T_SORT als Schlüssel
    2.) kein Array mit 3 Einträgen herauskommen
Du könntest ein assoziatives Array mit den '20070809' Zeitangaben als Schlüssel verwenden, dann dürfte zu jeder Angabe aber nur ein Termin existieren. Dann könntest Du anschließend ksort () verwenden
Im anderen Fall kannst Du usort () und eine selbstdefinierte Sortierfunktion verwenden (siehe Bsp.im Manual)
nikosch ist offline  
Alt 31.07.2007, 02:54  
Benutzer
 
Registriert seit: 14.02.2006
Beiträge: 49
webazubi
Standard

Habe jetzt meine Arrayerstellung geändert und komme auf untenstehendes Ergebnis. Alle drei Zeilen kommt ein Datensatz, also in Zeile 0 beginnt der 1. Datensatz mit dem Sortierdatum, dann Zeile 1 der Terminname und Zeile 2 eine Termin-ID. IN Zeile 3 beginnt eigentlich ein neuer Datensatz.
Daher jetzt die Fragen:
1. Wie kann ich daraus ein schönes strukturiertes Array machen, das ich 2. nach der Sortierdatumsspalte sortiert ausgeben kann?

Code:
array(18) { 
[0]=>  string(8) "20070805" 
[1]=>  string(78) "Termin1" 
[2]=>  string(3) "178" 
[3]=>  string(8) "20070803" 
[4]=>  string(25) "Termin2" 
[5]=>  string(3) "248" 
[6]=>  string(8) "20070809" 
[7]=>  string(10) "Termin3" 
[8]=>  string(3) "202" 
}
Nachtrag: Mit der Funktion array_chunk($array, 3) kriege ich jetzt folgende Struktur, aber noch keine Sortierung hin:
Code:
Array ( 
[0] => Array 
( 
	[0] => 20070805 
	[1] => Termin1
	[2] => 178 
) 
[1] => Array 
( 
[0] => 20070803 
[1] => Termin2
[2] => 248 
) 

[2] => Array 
( 
[0] => 20070809 
[1] => Termin3
[2] => 202 
) 
}
Und noch einen Nachtrag:
Nach array_chunk noch ein usort und eine for-Abfrage und ich habe meine Sortierung. Problem damit erledigt und besten Dank.
webazubi ist offline  
Alt 31.07.2007, 20:51  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Das ist Quark was du machst und außerdem erinnert mich dein Skript an mein Katastrophen-Skript von vor ein paar Jahren. Genauso ein schrecklich zu wartender Code:
PHP-Code:
<?php
while (count($termine) < $anzahl)
{
$datumarray getdate($datum);
if (
$datumarray["yday"] == $heutearray["yday"] && $datumarray["year"] == $heutearray["year"])
$termine[] = $heuteText;
elseif (
$datum $heute$termine[] = formatAusgabexy($datumarray);
$datum mktime(0,0,0,$datumarray["mon"],$datumarray["mday"]+$intervall $z_dauerx 1,$datumarray["year"]);
}
$datergo "<tt>".join("
"
,$termine)."</tt>";
$x_jahr substr($datergo_sort1,-4) ;
$x_monat substr($datergo_sort1,3,2) ;
$x_tag substr($datergo_sort1,0,2) ;
$datergo_sort $x_jahr $x_monat $x_tag
?>
!!!WTF!!!


Du hast ja offenbar jetzt schon Schwierigkeiten den Code zu verstehen, obwohl du ihn gerade eben erst geschrieben hast. Wie soll es jemand anderem oder dir in ein paar Wochen dann gehen?

Versuch deine Probleme mal zu abstrahieren und in Sub-Klassen abzuschieben.

Üblicherweise sollte man multidimensionale Arrays so erstellen, dass gleiches bei gleichem gruppiert wird.
Code:
array(18) {
[0]=>  string(8) "20070805"
[1]=>  string(78) "Termin1"
[2]=>  string(3) "178"
[3]=>  string(8) "20070803"
[4]=>  string(25) "Termin2"
[5]=>  string(3) "248"
[6]=>  string(8) "20070809"
[7]=>  string(10) "Termin3"
[8]=>  string(3) "202"
}
Das ist Käse. Wenn du keinen Primärschlüssel oder eindeutigen Identifizierer zur Verfügung hast, nimm fortlaufende Zahlen-Indexe, aber behalt die Gruppierungen bei.
Täusche ich mich, oder sind 178, 248, 202 genau solche IDs aus der Datenbank? Wenn ja sollte dein Array so aussehen:
Code:
array(
178 => array('title' => 'Termin 1', 'datestamp' => '20070805'),
202 => array('title' => 'Termin 3', 'datestamp' => '20060809'),
248 => array('title' => 'Termin 2', 'datestamp' => '20070803'));
Diesen kannst du jetzt mit usort() so sortieren:
PHP-Code:
<?php
usort
($arraycreate_function('$a, $b''return ($a["datestamp"] == $b["datestamp"]) ? 0 : ($a["datestamp"] < $b["datestamp"] ? -1 : 1);'));
?>
"datestamp" kannst du auch durch "title" austauschen, wenn du nach "title" sortieren möchtest. Jetzt hättest du zumindest einen eindeutigen Array, den du auch noch in 3 Monaten verstehst. Als Faustregel: Benutz keine numerischen Indexe, wenn du auch Bezeichner verwenden könntest.

$array[0] ist doch zugegebenermaßen ohne Aussagekraft, $array["title"] hat mehr Charme

Übrigens: Warum verwendest du einen YYYYMMDD-Datumsstempel? YYYY-MM-DD finde ich praktischer, kann man direkt aus MySQL's DATE übernehmen, an strtotime() übergeben, .. Wobei könnte auch mit YYYYMMDD funktionieren.
Zergling-new ist offline  
Alt 01.08.2007, 05:33  
Benutzer
 
Registriert seit: 14.02.2006
Beiträge: 49
webazubi
Standard

Zitat:
Zitat von Zergling
Das ist Quark was du machst und außerdem erinnert mich dein Skript an mein Katastrophen-Skript
Hast ja recht, und was ich hier an Käse zeige ist nur die Hälfte des unnötigen Codes. Würde ja gerne alles besser strukturieren, aber solange es irgendwie läuft bastel ich schon lieber wieder am nächsten Problem.

Aber bei jedem Updaten optimiere ich den Code!
Zitat:
Zitat von Zergling
Wenn ja sollte dein Array so aussehen:
Code:
array(
178 => array('title' => 'Termin 1', 'datestamp' => '20070805'),
202 => array('title' => 'Termin 3', 'datestamp' => '20060809'),
248 => array('title' => 'Termin 2', 'datestamp' => '20070803'));
Ganz genau so sollte er aussehen nd so wird er auch aussehen.


Zitat:
Zitat von Zergling
$array[0] ist doch zugegebenermaßen ohne Aussagekraft, $array["title"] hat mehr Charme
Sicher, ich überlege nur gerade ob es nicht mit der Nummer flexibler in Hinsicht auf eine mögliche Änderung des Feldnamens wäre, aber da wäre es wohl einfacher den Code entsprechend zu ersetzen.

Zitat:
Zitat von Zergling
YYYYMMDD-Datumsstempel? YYYY-MM-DD an strtotime() übergeben
Hatte beim Lesen von strtotime-Beispielen öfters schon gesehen, dass es da Probleme geben kann und das Datum nicht immer genau berechnet wird, zumindest nicht bei bestimmten Intervallen. Oder täusche ich mich da? Bevor ich was Falsches sage. Du meinst ich kann damit arbeiten?
webazubi ist offline  
 


Themen-Optionen
Thema bewerten
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.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Turnierbaum aus array erstellen kingflo PHP-Fortgeschrittene 11 30.07.2008 11:32
Soapfault: Undefined Property Argi PHP-Fortgeschrittene 0 28.07.2008 11:17
ARRAY: alle möglichen Kombinationen Tentacle PHP Tipps 2006 13 12.05.2006 00:18
Übersicht aus mehrdimensionalem Array erzeugen Crypi PHP-Fortgeschrittene 0 30.01.2006 13:44
Array auslesen andrew22 PHP Tipps 2006 3 21.01.2006 23:06
Array Formatierung PHP Tipps 2006 3 17.01.2006 19:12
Menü mit Unterpunkten supertramp Beitragsarchiv 7 18.10.2005 22:40
Problem beim vergleichen von 2 Arrays PHP Tipps 2005-2 1 06.10.2005 14:25
(schnellere) Funktion zum Zusammenfassen von CSS PHP-Fortgeschrittene 21 08.08.2005 16:47
Sortieren von Arrays mit mehr als 2 Dimensionen (Teil 2) Buhmann PHP-Fortgeschrittene 4 12.07.2005 14:03
Array wie auslesen? PHP Tipps 2005 7 07.03.2005 11:43
Wie sortiere ich ein Array nach 2 Indizes? PHP-Fortgeschrittene 12 13.01.2005 17:09
[Erledigt] Mehrdimensionales Array in eindimensionales Array umwandeln PHP-Fortgeschrittene 3 03.01.2005 22:31
Abfrage mit id aus anderer Tabelle suter PHP Tipps 2004-2 15 16.12.2004 14:25

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
datumarray zu numerisch umwandeln

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:46 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.