Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 
  Druckansicht

  PHP: Datenbankabfrage in zweidimensionales Array schreiben
Autor Nachricht
    BeitragVerfasst: 30.04.2009 08:00 
Co-Admin
Co-Admin
Benutzeravatar
Offline

Beiträge: 3349
Registriert: 18.12.1999 02:01
Wohnort: From Hell
Moins,

kommt ja nicht oft vor, dass ich mal nicht weiter komme ;) aber zur Zeit hänge ich etwas. Ich habe ein Script geschrieben, was mir meine gearbeiteten Stunden nach Zeit und Ort entsprechend berechnet.

Für die benötigten Werte habe ich mehrere 2D-Arrays angelegt, in der Form:
Code:
$schichtform = array(
    'r'  => array('anz' => 'r', 'std' => '0', 'art' => 'Ruhe aus Nacht'),
    'R'  => array('anz' => 'R', 'std' => '0', 'art' => 'Ruhe')
);

Um das Script jetzt etwas schlanker zu gestalten, sollen diese Werte in eine MySQL-DB verschwinden. Das ist erstmal nicht das Problem. Vielmehr: Wie schaffe ich es, die Daten aus der DB dann wieder in ein 2D-Array auszulesen? Die Abfragen im Script basieren natürlich allesamt auf dieser Array-Struktur:
Code:
zB
if($schichtform[$schicht][anz]==U)...

Diese Abfrage muss zwingend beibehalten werden. Der Aufwand alles umzuschreiben wäre enorm (das Script hat zZt über 1400 Zeilen inkl Design).

Kann ich die Daten aus der Datenbank nicht einfach in ein zweidimensionales Array am Anfang des Scripts laden und die $Funktionen greifen dann auf Dieses zurück, so wie jetzt auch, nur dass das Array "in echt" in dem Script steht?

Bin für alle Ideen offen ;)
Ich glaube, sonderlich schwer kann es nicht sein. Finde aber im Moment keine Lösung.

greetz
JMD

________________________
Bild
Erst nachdem wir alles verloren haben, haben wir die Freiheit, alles zu tun.
Specs: knotenberlin.de/pc.html


Nach oben
 Profil E-Mail senden  
 

  re: PHP: Datenbankabfrage in zweidimensionales Array schreib
    BeitragVerfasst: 01.05.2009 09:59 
Moderator
Moderator
Benutzeravatar
Offline

Beiträge: 1533
Registriert: 19.04.2002 01:01
Wohnort: Ulm
Irgendwie kann ich mir grad nicht so recht vorstellen, wo denn das Problem liegt ;-)
Bin mir ja sicher, dass das ganze schwerer ist, als ich mir's vorstelle. Ich halte dich ja für kompetent auf dem Gebiet - aber dein Post enthält meiner Meinung zu wenig Informationen.

Wie sind die Daten denn in der DB abgelegt? Gibts denn in dem "äußeren" Array so viele Einträge, dass du da nicht für jeden Eintrag einen eigenen DB-Abruf hinschreibst? Oder kannst du nicht eine oder mehrere Schleifen benutzen?

________________________
"Ich habe keinen Stil. Ich bin ich." - Helge Schneider


Nach oben
 Profil  
 

  
    BeitragVerfasst: 01.05.2009 10:44 
aktives Mitglied
aktives Mitglied
Benutzeravatar
Offline

Beiträge: 695
Registriert: 12.07.2004 21:23
Wohnort: FRIESLAND
Was haut denn an Deiner Idee nicht hin, die Daten wie Du vorgeschlagen hast, in ein 2D-Array zu speichern?


Nach oben
 Profil E-Mail senden  
 

  
    BeitragVerfasst: 01.05.2009 17:40 
Co-Admin
Co-Admin
Benutzeravatar
Offline

Beiträge: 3349
Registriert: 18.12.1999 02:01
Wohnort: From Hell
Das Array, bzw die Daten sind pro "Aufgabengebiet" in einer Tabelle abgelegt (wie halt vorher in dem Array). Rein von der Logik her ist sogar der Aufbau genau gleich wie das 2D-Array. "Bezeichner" - jetzt Spaltenname - und dann die entsprechenden Einträge.

Das 2D-Array oben ist stark gekürzt und ausserdem sind diese Arrays unflexibel. Ich möchte die Daten die in den Arrays gespeichert sind hin und wieder ändern und vor allem Erweitern. Das geht halt am Besten mit einer MySQL-DB.

Das Problem dabei ist, dass ich jetzt nicht überall im Script Datenbankabfragen einbauen kann, wo vorher simple auf das 2D-Array zugegriffen wurde. Daher die Frage ob es möglich ist eine DB-Tabelle am Anfang des Scriptes in ein 2D-Array zu schreiben/speichern.

Ich bin mir relativ sicher, dass es geht und auch nicht sonderlich schwer ist. Mir fehlt aber der Wegweiser in die richtige Richtung. Etwas ähnliches in form einer function() habe ich ja schon hinbekommen, aber auch da müssten alle Abfragen neu geschrieben werden. Ausserdem ist eine function() beschränkt (zumin. mit dem was ich programmiert habe).

Fürs bessere Verständnis. Hier das Array (komplett):
Code:
$schichtform = array(
      'r'    => array('anz' => 'r', 'std' => '0', 'art' => 'Ruhe aus Nacht'),
      'R'  => array('anz' => 'R', 'std' => '0', 'art' => 'Ruhe'),
      'RA' => array('anz' => 'RA','std' => '0', 'art' => 'Ablöser'),
      'U'  => array('anz' => 'U', 'std' => '7.8', 'art' => 'Urlaub'),
      'BU' => array('anz' => 'BU', 'std' => '0', 'art' => 'Bildungsurlaub'),
      'K'  => array('anz' => 'K', 'std' => '0', 'art' => 'Krank'),
      'DU' => array('anz' => 'DU','std' => '6', 'art' => 'Dienstunterricht'),
      '9'  => array('anz' => 'Büro',  'std' => '7.8', 'art' => 'Büro'),
      '1'  => array('anz' => '06.00-14.00', 'std' => '8', 'art' => 'Frühdienst', 'vbbzeit' => '05:15'),
      '17' => array('anz' => '06.00-13.00', 'std' => '7', 'art' => 'Frühdienst', 'vbbzeit' => '05:15'),
      '12' => array('anz' => '06.00-15.00', 'std' => '9', 'art' => 'Frühdienst', 'vbbzeit' => '05:15'),
      '2'  => array('anz' => '14.00-22.00', 'std' => '8', 'art' => 'Spätdienst', 'vbbzeit' => '13:15'),
      '2d' => array('anz' => '13.00-22.00', 'std' => '9', 'art' => 'Spätdienst', 'vbbzeit' => '12:15'),
      '2e' => array('anz' => '14.00-21.00', 'std' => '7', 'art' => 'Spätdienst', 'vbbzeit' => '13:15'),
      '2f' => array('anz' => '15.00-21.00', 'std' => '6', 'art' => 'Spätdienst', 'vbbzeit' => '14:15'),
      '2g' => array('anz' => '13.00-21.00', 'std' => '8', 'art' => 'Spätdienst', 'vbbzeit' => '12:15'),
      '2h' => array('anz' => '14.00-20.00', 'std' => '6', 'art' => 'Spätdienst', 'vbbzeit' => '13:15'),
      '3'  => array('anz' => '22.00-06.00', 'std' => '8', 'art' => 'Nachtdienst', 'vbbzeit' => '21:15'),
      '37' => array('anz' => '22.00-06.00', 'std' => '7.5', 'art' => 'Nachtdienst', 'vbbzeit' => '21:15'),
      '3c' => array('anz' => '21.00-06.00', 'std' => '9', 'art' => 'Nachtdienst', 'vbbzeit' => '20:15'),
      '3d' => array('anz' => '21.00-06.00', 'std' => '8.5', 'art' => 'Nachtdienst', 'vbbzeit' => '20:15'),
      '51' => array('anz' => '20.00-06.00', 'std' => '9.5', 'art' => 'Nachtdienst', 'vbbzeit' => '19:00'),
      '52' => array('anz' => '22.00-08.00', 'std' => '10', 'art' => 'Nachtdienst', 'vbbzeit' => '21:15'),
      '53' => array('anz' => '20.00-06.00', 'std' => '10', 'art' => 'Nachtdienst', 'vbbzeit' => '19:10'),
      '54' => array('anz' => '20.00-06.00', 'std' => '9.25', 'art' => 'Nachtdienst', 'vbbzeit' => '19:10'),
      '4'  => array('anz' => '08.00-20.00', 'std' => '12', 'art' => 'Tagesdienst', 'vbbzeit' => '07:10'),
      '4a' => array('anz' => '08.00-14.00', 'std' => '6', 'art' => 'geteilter Tagesdienst', 'vbbzeit' => '07:10'),
      '4b' => array('anz' => '14.00-20.00', 'std' => '6', 'art' => 'geteilter Tagesdienst', 'vbbzeit' => '13:10'),
      '42' => array('anz' => '06.00-18.00', 'std' => '12', 'art' => 'Tagesdienst', 'vbbzeit' => '05:15'),
      '43' => array('anz' => '18.00-06.00', 'std' => '12', 'art' => 'Nachtdienst', 'vbbzeit' => '17:15'),
      );

Und passend dazu ein Beispiel für eine Abfrage, wo mit den Daten aus diesem Array gearbeitet wird (gekürzt):
Code:
//Stunden addieren
if($schichtform[$schicht][anz]=="U") { if($wochentag=="Sa" OR $wochentag=="So" OR $feiertage[$dbdatum][1]=="1") { $schichtform[$schicht][std] = "0"; } else { $schichtform[$schicht][std] = "7.8"; } }
if($feiertage[$dbdatum][1]=="1") { $ftstd = "7.8"; if($wochentag=="So" OR $schicht=="R" OR $schicht=="r" OR $schicht=="RA" OR !$schicht) $ftstd = "0"; } else { $ftstd = "0"; }
$summen[]=$schichtform[$schicht][std]+$ftstd;
$i=0; $gesamt_summe=0; while($i<count($summen)){
$gesamt_summe=$gesamt_summe+$summen[$i];
$i++;
}
$ftstdanz = $schichtform[$schicht][std]+$ftstd;
/// ermitteln aller Stunden die an Feiertagen erbracht wurden
oder auch
Code:
//echo $nachtschichten." Nachtdienst(e)<br>";
$nass = $nachtschichten;
if(!$nachtschichten) $nass = "0";
  }
$result = mysql_query("select schicht, ort FROM $tabelle$dbuser WHERE monat='$monat' AND jahr='$jahr' ORDER BY datum LIMIT 0, $mlimit");
while(list($schicht, $ort) = mysql_fetch_row($result)) {
      if ($schicht=="2" OR $schicht=="2d") $nachtstunden = "2";
      if ($schicht=="2e" OR $schicht=="2f" OR $schicht=="2g") $nachtstunden = "1";
      if ($ort=="K") $nachtstunden = "0";
      if ($schichtform[$schicht][art]=="Spätdienst") {
      $nachtstd[]=$nachtstunden;
      $ns=0;
      $allenachtstd=0;
         while($ns<count($nachtstd)){
         $allenachtstd=$allenachtstd+$nachtstd[$ns];
         $ns++;
         }
      }
   if ($ort=="K") { $schichtform[$schicht][std] = "0"; } else {
      if ($schicht=="52") $schichtform[$schicht][std] = "8";
      if ($schichtform[$schicht][art]=="Nachtdienst") {
      $nachtstd[]=$schichtform[$schicht][std];
      $ns=0;
     $allenachtstd=0;
         while($ns<count($nachtstd)){
         $allenachtstd=$allenachtstd+$nachtstd[$ns];
         $ns++;
         }
       }
  } }

Bissl wüst - geht aber noch :) und halt nur zur Veranschaulichung.

Von diesen 2D-Arrays habe ich zZt 5. Nicht jedes so wichtig, dass es in eine DB müsste, aber wäre halt praktisch.

greetz

________________________
Bild
Erst nachdem wir alles verloren haben, haben wir die Freiheit, alles zu tun.
Specs: knotenberlin.de/pc.html


Nach oben
 Profil E-Mail senden  
 

  
    BeitragVerfasst: 02.05.2009 13:18 
aktives Mitglied
aktives Mitglied
Benutzeravatar
Offline

Beiträge: 695
Registriert: 12.07.2004 21:23
Wohnort: FRIESLAND
Ich finde die Methode zwar äußerst umständlich, aber natürlich kannst Du die Daten aus einer DB auslesen und in ein Array schreiben.

1400 Zeilen Code sind aber schnell durchforstet und entsprechend geändert. Ich glaube, der Aufwand sich die Arrays zurechtzufrickeln ist nicht wesentlich geringer, als die Zeilen zu ändern.

Außerdem haste dann gleich etwas gesäuberten Code.


Nach oben
 Profil E-Mail senden  
 

  
    BeitragVerfasst: 03.05.2009 16:54 
Co-Admin
Co-Admin
Benutzeravatar
Offline

Beiträge: 3349
Registriert: 18.12.1999 02:01
Wohnort: From Hell
BuddyHu hat geschrieben:
Ich finde die Methode zwar äußerst umständlich, aber natürlich kannst Du die Daten aus einer DB auslesen und in ein Array schreiben.


Und wie? Es muss vor allem ein 2D-Array sein.

BuddyHu hat geschrieben:
1400 Zeilen Code sind aber schnell durchforstet und entsprechend geändert. Ich glaube, der Aufwand sich die Arrays zurechtzufrickeln ist nicht wesentlich geringer, als die Zeilen zu ändern.

Außerdem haste dann gleich etwas gesäuberten Code.


Damit wollte ich sagen, dass ich den Code nicht ändern will (unter keinen Umständen); der Aufwand ist - nach wie vor - zu groß. Ausserdem habe ich keine Lust überall da wo es dann -auf einmal- nötig wird, Datenbankabfragen zu schreiben, weswegen ich ja auch die DB einmal am Anfang des Scriptes in ein 2D-Array einlesen will, mit der dann weiter normal im Script (wie vorher sozusagen) gearbeitet werden kann.

________________________
Bild
Erst nachdem wir alles verloren haben, haben wir die Freiheit, alles zu tun.
Specs: knotenberlin.de/pc.html


Nach oben
 Profil E-Mail senden  
 

  re: PHP: Datenbankabfrage in zweidimensionales Array schreib
    BeitragVerfasst: 05.05.2009 17:17 
aktives Mitglied
aktives Mitglied
Benutzeravatar
Offline

Beiträge: 695
Registriert: 12.07.2004 21:23
Wohnort: FRIESLAND
Du liest ja die Tabelle z.B. so aus:

Code:
while($daten = mysql_fetch_array($result)) { ... }


Jetzt brauchst Du zuerst ein array, in welchem Du die Resultsets aus der Tabelle speicherst.

Dann kannst Du in der o.g. while-Schleife mit array_push($array, ...) das array ergänzen.

Danach musst Du im Hinblick auf Deine Schlüssel noch die Einzel-Arrays mit array_merge zusammenfügen. Ich wüsste sonst auf die Schnelle nicht, wie man das anders lösen könnte. Ist halt etwas aufwändig.

Du hattest erwähnt, dass Du den Code sauberer haben wolltest. Dann solltest Du nicht erst Daten aus einer Datenbank in ein Riesen-Array zwischenspeichern und dann nochmal auslesen. Das ist doch doppelt gemoppelt.


Nach oben
 Profil E-Mail senden  
 

  
    BeitragVerfasst: 06.05.2009 09:44 
Co-Admin
Co-Admin
Benutzeravatar
Offline

Beiträge: 3349
Registriert: 18.12.1999 02:01
Wohnort: From Hell
Naja, nicht sauberer, nur etwas weniger und ausserdem - diesen Punkt betreffend - dynamischer. Ich bin mir durchaus bewusst, dass dies keine tolle Lösung ist. Ich möchte es aber - zumindest vorerst - so umsetzen.

Soweit war ich bereits:
Code:
$result = mysql_query("SELECT schicht, anz, std, art, vbbzeit FROM fdl_schichtform");
while($row = mysql_fetch_array($result)) {


Über das, was jetzt kommen sollte war und bin ich mir unschlüssig. Ich habe es mit den unterschiedlichsten Variationen von array_push() und array_merge() probiert, bin aber zu keinem funktionierenden Ergebnis gekommen.

Das hatte ich mir selbst schon (vorher) "zusammengesponnen":
Code:
$schichtform = array($row[schicht] => array('anz' => $row[anz], 'std' => $row[std], 'art' => $row[art], 'vbbzeit' => $row[vbbzeit]));

Hat natürlich so nicht funktioniert. Bzw - eigentlich doch, aber eben leider nur für eine Abfrage innerhalb der Schleife. Ich brauch die Daten aber ausserhalb dieser while()-Schleife und für alle Werte (Schlüssel).

print_r ( $schichtform ); lieferte in der Schleife:
Code:
Array ( [r] => Array ( [anz] => r [std] => 0 [art] => Ruhe aus Nacht [vbbzeit] => ) ) usw...


Ausserhalb der Schleife wird nur noch der letzte Wert der in der Schleife verarbeitet wurde wiedergegeben - logo.


Was ich jetzt genau mit push und merge machen soll, da stell ich mich gerade ein wenig blöd an. Das Prinzip glaube ich verstanden zu haben, jedoch ergibt es mir nicht wirklich Sinn und funktioniert auch nicht (so wie ich das gemacht habe).

Code:
    $dbschicht = array('schicht' => $row[schicht]);
    $dbanz = array('anz' => $row[anz]);
    $dbstd = array('std' => $row[std]);
    $dbart = array('art' => $row[art]);
    $dbvbbzeit = array('vbbzeit' => $row[vbbzeit]);

// $dbschicht gibt dabei den Schlüssel des 2D-Arrays an //

$array3 = array_push ( $dbschicht, $dbanz, $dbstd, $dbart, $dbvbbzeit );

// So das Array pushen? //

$array4 = array_merge ( /* ? ja womit mergen ? */ $dbschicht );

Auch wenn einzelne Konstellationen durchaus funktioneren und ein Ergebnis wiedergeben, so ist dies dann aber leider ein eindimensonales Array und funktioniert nur in der while()-Schleife richtig.

Irgendwo habe ich ganz dicke Tomaten auf den Augen, aber wo?! Vielleicht kannste mir ja nochmal anhand eines Bsp helfen?

greetz

________________________
Bild
Erst nachdem wir alles verloren haben, haben wir die Freiheit, alles zu tun.
Specs: knotenberlin.de/pc.html


Nach oben
 Profil E-Mail senden  
 

  re: PHP: Datenbankabfrage in zweidimensionales Array schreib
    BeitragVerfasst: 06.05.2009 18:14 
Moderator
Moderator
Benutzeravatar
Offline

Beiträge: 1533
Registriert: 19.04.2002 01:01
Wohnort: Ulm
Hab das noch nie gemacht, aber geht's vielleicht so?

Zitat:
$array3 = array_push ( $dbschicht => array('anz' => $dbanz, 'std' => $dbstd, 'art' => $dbart, 'vbbzeit' => $dbvbbzeit );


Alternativ mit array_merge müsste das so aussehen:
Zitat:
$array1 = array($dbschicht => array('anz' => $dbanz, 'std' => $dbstd, 'art' => $dbart, 'vbbzeit' => $dbvbbzeit ));

$gesamt = array_merge($bisher_ausgelesenes_array, $array1);


Hoffe so funktionierts; wenn nicht, dann Asche auf mein Haupt ;)

________________________
"Ich habe keinen Stil. Ich bin ich." - Helge Schneider


Nach oben
 Profil  
 

Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 9 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


  Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
RSS-Feed
Impressum und Kontakt
Style created by phpBB3 styles , ziola alveo akuna
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Optimized by SEO phpBB
Deutsche Übersetzung durch phpBB.de