ralphi: formatierung eines arrays

hi nochmal zusammen,

ein Folgeproblem zu meinem vorherigen hat sich aufgetan.

ich hab jetzt eine Tabelle mit 30 Datensätzen - Zeit und Wert.

normalerweise lese ich die daten aus mit:
$datay1 = mysql_query(sprintf("select wert from tabelle"));
damit müsste ich doch eigentlich das Array '$datay1' haben ?!

ich könnte es jetzt mit zB:
while ($row =mysql_fetch_array($datay1)) {
echo $row[wert];
}
einzeln auslesen.

für das php-diagramm benötige ich folgende Form:
$datay1 = array(20,7,1.6,46,1,5,7,usw.);

auch wenn ich die ganzen $row werte auslese und in einem string mit komma zusammenpacke, funktionierts nicht.
$var="20,7,1.6,46,1,5,7,9,31 usw.";
$datay1 = array($var);

das php diag programm besteht aus zig unterprogrammen,
include_once ('dlib/jpgraph.php');
include_once ('dlib/jpgraph_line.php');
die  wiederum mit includs gespickt sind. da alle durchzugehen, wo und wie das array aufgedröselt ist für mich nicht möglich

hat jemand eine Idee?
das frontprog ist hinten dran.

grüße aus LA ralphi

<?php // content="text/plain; charset=utf-8"
require_once ('jpgraph/jpgraph.php');
require_once ('jpgraph/jpgraph_line.php');

$datay1 = array(20,7,16,46);
$datay2 = array(6,20,10,22);

// Setup the graph
$graph = new Graph(350,230);
$graph->SetScale("textlin");

$theme_class= new UniversalTheme;
$graph->SetTheme($theme_class);

$graph->title->Set('Background Image');
$graph->SetBox(false);

$graph->yaxis->HideZeroLabel();
$graph->yaxis->HideLine(false);
$graph->yaxis->HideTicks(false,false);

$graph->xaxis->SetTickLabels(array('A','B','C','D'));
$graph->ygrid->SetFill(false);
$graph->SetBackgroundImage("tiger_bkg.png",BGIMG_FILLFRAME);

$p1 = new LinePlot($datay1);
$graph->Add($p1);

$p2 = new LinePlot($datay2);
$graph->Add($p2);

$p1->SetColor("#55bbdd");
$p1->SetLegend('Line 1');
$p1->mark->SetType(MARK_FILLEDCIRCLE,'',1.0);
$p1->mark->SetColor('#55bbdd');
$p1->mark->SetFillColor('#55bbdd');
$p1->SetCenter();

$p2->SetColor("#aaaaaa");
$p2->SetLegend('Line 2');
$p2->mark->SetType(MARK_UTRIANGLE,'',1.0);
$p2->mark->SetColor('#aaaaaa');
$p2->mark->SetFillColor('#aaaaaa');
$p2->value->SetMargin(14);
$p2->SetCenter();

$graph->legend->SetFrameWeight(1);
$graph->legend->SetColor('#4E4E4E','#00A78A');
$graph->legend->SetMarkAbsSize(8);

// Output line
$graph->Stroke();

?>

  1. Hi,

    hat jemand eine Idee?

    Grundlagen lernen.
    Dass man einem Array neue nummerisch indizierte Werte mit $array[] = $value hinzufügen kann, fällt definitiv darunter.

    Und noch’ne Idee: Über irgendwo gefundenen Code auch ein bisschen Gedanken machen, anstatt ihn per Copy&Paste zu übernehmen.
    $datay1 = mysql_query(sprintf("select wert from tabelle"));
    Das ist bspw. ziemlicher Blödsinn, weil sprintf hier vollkommen überflüssig ist.

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  2. Hello Ralphi,

    ein Folgeproblem zu meinem vorherigen hat sich aufgetan.

    Ich schaue jetzt nicht nach, ob dazu noch ein offener Thread vorhanden ist, denn soviel Zeit habe ich heute nicht mehr. Aber generell solltest Du ggf. bitte die Regel beachten, keine neuen Threads anfangen, solange das Thema noch im Zusammenhang mit einem nicht erledigten und hier noch aktiven Thread steht.

    ich hab jetzt eine Tabelle mit 30 Datensätzen - Zeit und Wert.

    normalerweise lese ich die daten aus mit:

    $datay1 = mysql_query(sprintf("select wert from tabelle"));

    Damit hast Du aus allen verfügbaren Datensaätzen der Tabelle die Spalte wert ausgelesen und in einem _Resultset_ zusammenfassen lassen. In $datay1 steht jetzt ein Handle (Ressource Identifier) auf dieses Resultset ("Datei" im Speicher), oder wenn die die Abfrage schiefgegangen ist, ein |false|. Das fragst Du ab mit

    if($datay1)

    oder besser eigentlich mit

    if($datay1 === false)

    Sollte das if() erfüllt sein, ist die Abfrage schief gegangen.

    damit müsste ich doch eigentlich das Array '$datay1' haben ?!

    Jein. Du hast ein Handle auf das Abfrageergebnis, kannst dieses also darüber mittels eine speziellen Funktion in ein Array überführen.

    ich könnte es jetzt mit zB:

    while ($row = mysql_fetch_array($datay1))

    {
          echo $row['wert'];

    }
    einzeln auslesen.

    Das ist wiederum richtig, wenn $datay1 tatsächlich ein gültiger Resource-Identifier ist.

    #----

    für das php-diagramm benötige ich folgende Form:

    $datay1 = array(20,7,1.6,46,1,5,7,usw.);

    Das sollte aber jetzt tunlichst eine andere Variable werden. Den Resource-Identifier einfach zu überschreiben, ist keine gute Idee.

    $_datenliste = array();    ## leeres Array bereitstellen

    while ($_row = mysql_fetch_array($datay1))  ## nächsten Datensatz aus dem Resultset holen
      {
          echo $_datenliste[] = $_row['wert'];    ## und der Datenliste hinzufügen
      }

    $ergebnis = implode(',',$_datenliste);  Das Array $_datenliste in einen kommaseparierten String umwandeln

    ## Zur Kontrolle:

    echo "<pre>\r\n";
      echo htmlspecialchars(print_r($_datenliste,1));
      echo htmlspecialchars($ergebnis);
      echo "</pre>\r\n";

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Tach!

      $datay1 = mysql_query(sprintf("select wert from tabelle"));
           if($datay1)
      oder besser eigentlich mit
           if($datay1 === false)

      Die beiden Abfragen sind genau gegenteilig. Und die zweite ist zwei Stufen zu überflüssig. Im Fehlerfall erhältst du immer ein unzweifelhaftes false. Ressourcenkennungen (im Falle von SELECT etc.) sind im booleschen Kontext immer true und INSERT und Co. ergeben true. 0 oder irgendein anderer zu false kompatibler Wert kommt hier im Positiv-Fall nicht vor.

      dedlfix.

      1. Hello dedlfix,

        gerade wollte ich ausschalten, da sah ich noch dein "Überwachungsposting" :-)
        Gut, dass Du aufgepasst hast.

        $datay1 = mysql_query(sprintf("select wert from tabelle"));
             if($datay1)
        oder besser eigentlich mit
             if($datay1 === false)

        Die beiden Abfragen sind genau gegenteilig.

        Klar, die erste ermittelt, ob ein _gültiger_ Resource-Identifier übermittelt wurde und die zweite, ob genau das Gegenteil passiert ist.

        Und die zweite ist zwei Stufen zu überflüssig. Im Fehlerfall erhältst du immer ein unzweifelhaftes false. Ressourcenkennungen (im Falle von SELECT etc.) sind im booleschen Kontext immer true und INSERT und Co. ergeben true. 0 oder irgendein anderer zu false kompatibler Wert kommt hier im Positiv-Fall nicht vor.

        Also weitermachen, wenn:

        if ($datay1)
        {
            $_datenliste = array();    ## leeres Array bereitstellen

        while ($_row = mysql_fetch_array($datay1))  ## nächsten Datensatz aus dem Resultset holen
            {
                echo $_datenliste[] = $_row['wert'];    ## und der Datenliste hinzufügen
            }

        $ergebnis = implode(',',$_datenliste);  ## Das Array $_datenliste in einen
                                                    ## kommaseparierten String umwandeln

        ## Zur Kontrolle:

        echo "<pre>\r\n";
            echo htmlspecialchars(print_r($_datenliste,1));
            echo htmlspecialchars($ergebnis);
            echo "</pre>\r\n";
        }
        else
        {
            ## Fehlerbehandlung
            echo "Fehler";
        }

        Ich hoffe, jetzt stimmts.
        ICh muss jetzt meien Bandscheibe beruhigen und auf horizontal umschalten :-(

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
    2. Hi Tom,

      danke für die lösung - es hat geklappt.
      die trennzeichen eines arrays spielen anscheinend nur beim manuellen füllen eine rolle.
      $_datenliste[] = $_row['wert'];
      $_datenliste wird im prog akzeptiert. da das prog eine *.png erzeugt, mag es dagegen, print und echo im quelltext, nicht.

      ich glaub jetzt hab ichs bisserl mehr verstanden. die DB-abfrage holt mir die daten in eine art wolke, um nach belieben welche rauszupicken zu können. (also kein array)
      eine variable deklarier ich als frisches, x-dimensionales, leeres, array mit $var=array();
      der zeiger des arrays steht anscheinend am Anfang immer auf [1] und erhöht sich automatisch.

      viele grüße aus LA
      ralphi

      1. Hello,

        danke für die lösung - es hat geklappt.

        Bitte. Gerne geschehen.

        die trennzeichen eines arrays spielen anscheinend nur beim manuellen füllen eine rolle.
        $_datenliste[] = $_row['wert'];
        $_datenliste wird im prog akzeptiert. da das prog eine *.png erzeugt, mag es dagegen, print und echo im quelltext, nicht.

        ich glaub jetzt hab ichs bisserl mehr verstanden. die DB-abfrage holt mir die daten in eine art wolke, um nach belieben welche rauszupicken zu können. (also kein array)

        Wenn Du es so nennen willst. Wie damit umzugehen ist, müssen nur die dafür gebauten Funktionen oder Methoden wissen, wie z.B. mysql_fetch_assoc(). Die macht dann aus einem "wolkigen Datensatz" ein Array mit definiertem Aufbau.

        eine variable deklarier ich als frisches, x-dimensionales, leeres, array mit $var=array();
        der zeiger des arrays steht anscheinend am Anfang immer auf [1] und erhöht sich automatisch.

        Der interne Arrayzeiger steht am Anfang auf NULL, nicht auf 0. Das Array ist leer. Das erste Element des (numerischen) Arrays bekommt dann den Index 0 und ja, der Zeiger wird bei dieser Schreibweise immer automatisch um Eins incrementiert.

        Wenn man aus der Datenbank auch einen Primärschlüssel holt, dann empfiehlt es sich oft, DEN anstelle der automatischen Incrementierung im Array als Index zu benutzen.

        $_datenliste = array();    ## leeres Array bereitstellen

        while ($_row = mysql_fetch_array($datay1))  ## nächsten Datensatz aus dem Resultset holen
          {
              echo $_datenliste[$_row['id']] = $_row['wert'];    ## und der Datenliste hinzufügen
          }

        Die Daten liegen dann im Array aber in derjenigen Reihenfolge vor, in der sie aus der DB angefordert wurden, also z.B. zufällig oder nach der angeforderten ORDER sortiert.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
         ☻_
        /▌
        / \ Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
  3. moin,

    für das php-diagramm benötige ich folgende Form:
    $datay1 = array(20,7,1.6,46,1,5,7,usw.);

    Warum erst ein Array erstellen? Wenn Du was auszugeben hast, dann doch gleich an der richtigen Stelle, nutze eine Callbackfunktion, Beispiel:

      
    <?php  
      
    class CB{  
    	// Erstelle eine DB Verbindung  
    	public function __construct(){  
    		$this->CONN = mysql_connect('localhost', '','') or die("No DB");  
    		mysql_select_db('myweb', $this->CONN) or die(mysql_error());  
    	}  
      
    	// Zapfe die Datenquelle an  
    	public function data(){  
    		$res = mysql_query("SELECT id, url FROM perlbase");  
    		// rufe mit jedem Record die Callbackfunktion  
    		while($r = mysql_fetch_assoc($res)){  
    			if(isset($r)){  
    				$this->callback($r);  
    			}  
    		}  
    	}  
      
    	// Schreibt jeden Record in ein Template  
    	// das kann auch eine Tabellenzeile sein mit tr, td  
    	private function callback($hunt = array()){  
    		printf("%s => %s\n", $hunt['id'], $hunt['url']);  
    	}  
      
    }  
      
    $cb = new CB; // erstelle Instanz  
      
    ?>  
    <!-- Tabelle ausgeben -->  
    ============== Headline ==========================================  
    <?php $cb->data(); ?>  
    ============== Footer ============================================  
    
    
    1. Tach!

      für das php-diagramm benötige ich folgende Form:
      $datay1 = array(20,7,1.6,46,1,5,7,usw.);
      Warum erst ein Array erstellen? Wenn Du was auszugeben hast, dann doch gleich an der richtigen Stelle, nutze eine Callbackfunktion,

      Das geht hier aus seinem Quasi-Doppelpost nicht hervor, aber er will die Daten einer Diagrammerstellungssoftware übergeben. Eine Ausgabe steht also nicht unmittelbar an und das Array ist notwendig. Statt eines Arrays könnte er jedoch in einer Klasse das Iterator- oder/und IteratorAggregate-Interface implementieren, falls die Diagrammsoftware nicht (nur) fest auf is_array() prüft. Dazu muss er aber den gesamten Rest der Abfrage auf OOP umstellen und der Implementierungsauwand des Interfaces ist auch deutlich höher als ein Array erstellender Dreizeiler. Ob dieser Aufwand gerechtfertigt ist?

      while($r = mysql_fetch_assoc($res)){
        if(isset($r)){
          $this->callback($r);
        }
      }

      Deine Lösung ist auch kein Callback sondern ein ganz normaler fest verdrahteter Methodenaufruf. Callbacks heißen so, weil man einem ausführenden Code den Verweis auf eine zur Laufzeit definierten oder jedenfalls prinzipiell auswechselbaren Methode oder Funktion übergibt. Ein Callback ist also etwas, das zwar vom ausführenden Code benutzt wird aber nicht unter dessen Einfluss steht.

      Das was du da in OOP erstellt hast, nutzt dessen Vorteile nicht aus. Es ist im Grunde genommen nur prozedurale Programmierung in eine Klasse gebracht. Die beim OP (wenn auch vielleicht unbeabsichtigt, aber durch die Diagrammsoftware erzwungene) vorhandene Trennung nach Datenbeschaffung und Verarbeitung hast du auch wieder aufgelöst.

      Und zu guter Letzt ist das if-isset völlig nutzlos. mysql_fetch_assoc() liefert immer ein Ergebnis, bei dem isset() true ergibt. Selbst eine Prüfung, auf nicht false ist sinnlos, weil der Körper der While-Schleife gleich gar nicht ausgeführt, wenn das der Fall ist.

      dedlfix.

    2. Hello,

      class CB{
      // Erstelle eine DB Verbindung
      public function __construct(){
      $this->CONN = mysql_connect('localhost', '','') or die("No DB");
      mysql_select_db('myweb', $this->CONN) or die(mysql_error());
      }

      die() ist keine Fehlerbehandlung, sondern Schmuddelkram. Und in der OOP ist die() sowieso 'verboten', denn dort müsstest Du Exceptions nutzen, um keine undefinierten oder labilen Zustände zu erzeugen, oder Datenmüll zu hinterlassen.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
       ☻_
      /▌
      / \ Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Tach!

        die() ist keine Fehlerbehandlung, sondern Schmuddelkram. Und in der OOP ist die() sowieso 'verboten', denn dort müsstest Du Exceptions nutzen, um keine undefinierten oder labilen Zustände zu erzeugen, oder Datenmüll zu hinterlassen.

        Der erste Satz ist uneingeschränkt richtig. Aber die Begründung vom zweiten Satz ist verbesserungswürdig. die()/exit hinterlässt unter PHP einen definierten Zustand, wie jedes andere Script-Ende auch. Sogar Shutdown-Funktionen und Objekt-Destruktoren werden ausgeführt. Ein Script-Abbruch noch dazu garniert mit einer MySQL-Fehlermeldung ist aber nicht das was der Anwender zu sehen wünscht, auch nicht im Fehlerfall. Selbst wenn das Script einen schwerwiegenden Fehler ohne alternative Handlungsmöglichkeit feststellt, aber selbst noch in der Lage ist zu reagieren, kann es zumindest noch einen 500er an den Webserver durchreichen.

        dedlfix.

        1. Hello,

          die() ist keine Fehlerbehandlung, sondern Schmuddelkram. Und in der OOP ist die() sowieso 'verboten', denn dort müsstest Du Exceptions nutzen, um keine undefinierten oder labilen Zustände zu erzeugen, oder Datenmüll zu hinterlassen.

          Der erste Satz ist uneingeschränkt richtig.

          Aber die Begründung vom zweiten Satz ist verbesserungswürdig. die()/exit hinterlässt unter PHP einen definierten Zustand, wie jedes andere Script-Ende auch.

          Bezogen auf den reinen Prozessoranweisungsablauf schon, nicht aber bezogen auf den Prozessablauf. Der wird einfach an einer Stelle abgebrochen, unabhängig davon, ob logische Teile fertig abgehandelt wurde, oder nicht. Eben dieses Manquo will man schließlich in der OOP abfangen, indem man Exceptions benutzt.

          Sogar Shutdown-Funktionen und Objekt-Destruktoren werden ausgeführt.

          In der prozeduralen Programmierung, soweit man sie seit Existenz von Exit-Handlern, wie z.B. der Shutdown-Funktion überhaupt noch so nennen darf, muss man immer daran denken, für alle erzwungenen Abruchsszenarien einen Handler in die Exit-Chain einzutragen. Eben dies geschieht bei der OOP durch Verwendung von Exceptions wesentlich geordneter und "zuordnungsfähiger". Verschwindet die Methode, die die Exception wirft, findet auch keine Exception-Behandlung mehr dafür statt. OK, die Behandlungsmethode selbst bleibt vielleicht zurück, wird aber ja nicht mehr aktiviert.

          Um das mit einer Exitroutinen-Kette zu ereichen, muss man sich schon ganz schön einen abkrampfen.

          Daher sollte in einer prozeduralen Umgebung jede Funktion selber für eine (vorgangsbezogen) saubere Abwicklung sorgen und für die notwendigen Schutzmaßnahmen im Fehlerfall. Ein die() aktiviert hier aber den Exit-Handler. Der kann aber nicht wissen, von wo aus er aufgerufen wurde.

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
           ☻_
          /▌
          / \ Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Tach.

            die() ist keine Fehlerbehandlung, sondern Schmuddelkram. Und in der OOP ist die() sowieso 'verboten', denn dort müsstest Du Exceptions nutzen, um keine undefinierten oder labilen Zustände zu erzeugen, oder Datenmüll zu hinterlassen.

            Der erste Satz ist uneingeschränkt richtig. Aber die Begründung vom zweiten Satz ist verbesserungswürdig. die()/exit hinterlässt unter PHP einen definierten Zustand, wie jedes andere Script-Ende auch.

            Bezogen auf den reinen Prozessoranweisungsablauf schon, nicht aber bezogen auf den Prozessablauf. Der wird einfach an einer Stelle abgebrochen, unabhängig davon, ob logische Teile fertig abgehandelt wurde, oder nicht. Eben dieses Manquo will man schließlich in der OOP abfangen, indem man Exceptions benutzt.

            Exceptions sind weder eine Erfindung der OOP noch deren einzige Möglichkeit, mit Fehlern/Ausnahmen umzugehen.

            --
            Always remember that you are unique. Just like everybody else.
      2. hi,

        die() ist keine Fehlerbehandlung, sondern Schmuddelkram.

        Beim Testen von Scripts ist die() die beste Fehlerbehandlung.

        Hotti