Jo: Kleines Logisches/Syntax Problem

Guten Morgen zusammen,

ich hab ein Problem mit dem ich in php noch nicht konfrontiert war und mir keine Möglichkeit einfällt wie ich das lösen kann.

Es geht um folgendes, ich habe 2 Zahlenreihen. Die erste Reihe hat den Inhalt von 2 variablen etwa [2,4]. Der Inhalt der Zweiten Reihe ist etwas variabler er kann von keinem Inhalt bis zu 8 einträgen reichen, etwa so: [1,3 ; 1,9 ; 4,2 ; 5,2 ; 22,4].

Jetzt suche ich nach einer Möglichkeit, mit php, die Zahl aus der 2ten Reihe auszusuchen die den kleinsten Abstand nach oben oder unten, zum Intervall der 1ten Reihe besitzt.

In der Beispielhaften Reihe wäre das 1,9 aber wie setze ich das mit php um?

Danke für eure hilfe.

Gruß Jo

  1. Hi,

    ich hab ein Problem mit dem ich in php noch nicht konfrontiert war und mir keine Möglichkeit einfällt wie ich das lösen kann.

    Es geht um folgendes, ich habe 2 Zahlenreihen. Die erste Reihe hat den Inhalt von 2 variablen etwa [2,4]. Der Inhalt der Zweiten Reihe ist etwas variabler er kann von keinem Inhalt bis zu 8 einträgen reichen, etwa so: [1,3 ; 1,9 ; 4,2 ; 5,2 ; 22,4].

    Jetzt suche ich nach einer Möglichkeit, mit php, die Zahl aus der 2ten Reihe auszusuchen die den kleinsten Abstand nach oben oder unten, zum Intervall der 1ten Reihe besitzt.

    Du nimmst die erste Zahl als $ergebnis aus dem zweiten Array und berechnest deren "Abstand" als $ergebnisabstand.

    Dann gehst Du in einer Schleife über die restlichen Werte aus dem Array. Dabei berechnest Du jeweils den $abstand. Wenn der geringer ist als der bisherige $ergebnisabstand, nimmst Du diesen Wert als neues $ergebnis und den neuen Abstand als $ergebnisabstand.

    PS: es ist verwirrend, daß Du das Komma mal als Trenner im Array und mal als Dezimaltrenner (der in php der Punkt wäre) verwendest. ; als Trenner der Werte im Array ist auch seltsam.

    cu,
    Andreas a/k/a MudGuard

    1. Hey,

      PS: es ist verwirrend, daß Du das Komma mal als Trenner im Array und mal als Dezimaltrenner (der in php der Punkt wäre) verwendest. ; als Trenner der Werte im Array ist auch seltsam.

      Ja sry ich hab das grad nur schnell runter getippt^^.

      also richtig müsste es lauten:

      1.Reihe [$a , $b] 2.Reihe [$c , $d , $e , $f , $g]

      Alle variablen sind floats und kommen aus einer Datenbank.

      MudGuard hat das schon ganz richtig erfasst, sowas habe ich mir auch schon überlegt, nur Schleifen sind rein Syntax technisch mir etwas unzugänglich. Ich meine ich verstehe wie die verschiedenen Schleifen funktionieren, aber ich muss jetzte erstmal schaun wie ich

      "..über die restlichen Werte aus dem Array. Dabei berechnest Du jeweils den $abstand. Wenn der geringer ist als der bisherige $ergebnisabstand, nimmst Du diesen Wert als neues $ergebnis und den neuen Abstand als $ergebnisabstand."

      hinkriege.

      Danke erstmal Mudguard :)

      Gruß Jo

  2. Tach!

    Jetzt suche ich nach einer Möglichkeit, mit php, die Zahl aus der 2ten Reihe auszusuchen die den kleinsten Abstand nach oben oder unten, zum Intervall der 1ten Reihe besitzt.

    Vermutlich kommst du mit array_reduce() zum Ziel.

    Aber so ganz hab ich nicht verstanden, was wirklich vorliegt. Wenn du von 2 Variablen sprichst, solltest du auch solche präsentieren. Oder du erklärst genau, was [x,y] und [a,b; c,d] darstellen soll. Sind das Zahlen mit Kommastellen in deutscher Schreibweise oder ist das ein beziehungsweise ein verschachteltes Array mit jeweils 2 Integer-Zahlen?

    dedlfix.

  3. Moin!

    Sieht lösbar aus.

    Definiere das im Zitat fett markierte bitte so, dass auch ich das verstehe.

    Möglichkeit, mit php, die Zahl aus der 2ten Reihe auszusuchen die den kleinsten Abstand nach oben oder unten, zum Intervall der 1ten Reihe besitzt

    Am besten mit einer oder mehreren math. Formeln.

    Also A, B sei die erste Reihe. C, D sei die Reihe, deren "Abstand" zu berechnen ist.

    Formel für "kleinster Abstand nach oben oder unten"?

    Und zeige bitte auch wie Du die Daten in PHP gespeichert hast. Die Ausgabe der Arrays mit var_dump() würden mir reichen.

    Jörg Reinholz

  4. Hey,

    ich glaub ich habs. Stimmt das so in etwa?

    ($p_r ist das array aus der zweiten Reihe)

    $i=0;
    $anzahl = count($p_r);
    
    while($i <= $anzahl)
    {
    	$i=0;
    	$abstand = 50;
    	$abstand_unten = $p_r[$i] - $hz[0];
    	$abstand_oben = $p_r[$i] - $hz[1];
    	if($abstand_unten < $abstand_oben < $abstand)
    	{
    		$abstand = $abstand_unten;
    	}
    	elseif($abstand_oben < $abstand_unten < $abstand)
    	{
    		$abstand = $abstand_oben;
    	}
    	$i++;
    }
    
    1. mumpitz... ich baruch ja die stelle im array:

      $i=1;
      $anzahl = count($p_r);
      
      //$abstand_unten = $p_r[$a] - $hz[0];
      //$abstand_oben = $p_r[$a] - $hz[1];
      
      while($i<$anzahl)
      {
      	$abstand = 50;
      	$abstand_unten = abs($p_r[$i] - $hz[0]);
      	$abstand_oben = abs($p_r[$i] - $hz[1]);
      	if($abstand_unten < $abstand_oben < $abstand)
      	{
      		$abstand = $abstand_unten;
      		$a = $i;
      	}
      	elseif($abstand_oben < $abstand_unten < $abstand)
      	{
      		$abstand = $abstand_oben;
      		$a = $i;
      	}
      	$i++;
      }
      

      $a müsste dann die Stelle im Array ausgeben dessen Abstand am kleinsten ist oder?

      Gruß Jo

      1. Hi,

        
        
        > while($i<$anzahl)
        > {
        > 	$abstand = 50;
        
        

        Abstand wird so in jedem Schleifendurchlauf wieder auf 50 gesetzt.

        
        
        > 	$abstand_unten = abs($p_r[$i] - $hz[0]);
        > 	$abstand_oben = abs($p_r[$i] - $hz[1]);
        > 	if($abstand_unten < $abstand_oben < $abstand)
        
        

        $abstand_unten < $abstand_oben ergibt true oder false.

        Und true < 50 oder false < 50 ($abstand ist ja immer 50) ergibt keinen Sinn.

        Auch wenn $abstand jeweils der kleinste bis jetzt gefundene Abstand wäre, wäre das immer noch eine Zahl, die sich schlecht mit booleans vergleichen läßt (auch wenn PHP dabei entsprechende Typumwandlungen vornimmt - es kommt höchstwahrscheinlich nicht das raus, was Du willst)

        $a müsste dann die Stelle im Array ausgeben dessen Abstand am kleinsten ist oder?

        Nö. Da kommt Unsinn bei raus.

        cu,
        Andreas a/k/a MudGuard

        1. Hi,

          
          > while($i<$anzahl)
          > {
          > 	$abstand = 50;
          
          

          Abstand wird so in jedem Schleifendurchlauf wieder auf 50 gesetzt.

          Ja das hab ich schon geändert als es mir aufgefallen ist.

          
          > 	$abstand_unten = abs($p_r[$i] - $hz[0]);
          > 	$abstand_oben = abs($p_r[$i] - $hz[1]);
          > 	if($abstand_unten < $abstand_oben < $abstand)
          
          

          $abstand_unten < $abstand_oben ergibt true oder false.

          Und true < 50 oder false < 50 ($abstand ist ja immer 50) ergibt keinen Sinn.

          Auch wenn $abstand jeweils der kleinste bis jetzt gefundene Abstand wäre, wäre das immer noch eine Zahl, die sich schlecht mit booleans vergleichen läßt (auch wenn PHP dabei entsprechende Typumwandlungen vornimmt - es kommt höchstwahrscheinlich nicht das raus, was Du willst)

          Das hab ich mittlerweile so:

          
          if($abstand_unten < $abstand_oben and $abstand_oben < $abstand)
          	{
          		$abstand = $abstand_unten;
          		$a = $i;
          	}
          	elseif($abstand_oben < $abstand_unten and $abstand_unten < $abstand)
          	{
          		$abstand = $abstand_oben;
          		$a = $i;
          	}
          

          abs() scheint irgendwie nicht zu funktionieren also hab ich noch eine Betrags abfrage rein gebaut. Die dann gegebenenfalls mit -1 multipliziert.

          So vergleicht er ja jetzt ob Unten bzw. Oben kleiner sind als Oben bzw. Unten und ob sie jeweils kleiner sind als der bis dahin kleinste Abstand. falls nicht wird die If bzw Elseif ja garnicht ausgeführt, weil dann ja die abfrage False ergibt, und $a bleibt auf dem $i wo der kleineste Abstand ist. Oder täusche ich mich da vollkommen?

          $a müsste dann die Stelle im Array ausgeben dessen Abstand am kleinsten ist oder?

          Nö. Da kommt Unsinn bei raus.

          cu,
          Andreas a/k/a MudGuard

  5. Guten Abend zusammen,

    Ich rolle das hier nochmal auf, da ich an der Stelle immer noch nicht weiter gekommen bin und mich das mitlerweile mehr und mehr verwirrt.

    Also in meiner Datenbank sind 2 Tabellen, nennen wir sie Tab1 und Tab2. Aus der lese ich nun einige Daten mit:

    $query1 = "SELECT wert1,wert2 FROM Tab1 WHERE sid='$i'";
    $result1 = mysql_query($query1);
    $Tab1 = mysql_fetch_array($result1);
    
    $query2 = "SELECT wert3 FROM Tab2 WHERE sid='$i'";
    $result2 = mysql_query($query2);
    $Tab2 = mysql_fetch_array($result2);
    

    aus.

    Ich würde das je gern mit nem LEFT JOIN machen aber das funktioniert nur bei phpmyadmin. Wenn ich den SQL code in mein $query einfüge gibt er mir ein Fehler aus. Weiß der Geier warum.

    So nun zum Teil der mich wirklich verwirrt: Aus der Tabelle 1 bekomme ich 2 Werte zurück die in einer Zeile in der Tabelle stehen. Das lässt sich wunderbar mit print_r($Tab1) ausgeben. Aus der Zweiten Tabelle bekomme ich zwischen 0 und 8 Werte zurück, meistens etwa 5-6. Diese Werte stehen in mehreren Zeilen in der Tabelle 2. Wenn ich nun versuche diese mit print_r($Tab2) auszugeben bekomme ich NUR den Ersten Wert aus der Ersten Zeile ausgegeben. Also hab ich es mit:

    echo '<table border="1">';
    while ($Tab2 = mysql_fetch_array($result2))
    {
      echo "<tr>";
      echo "<td>". $wert3['name'] . "</td>";
      echo "</tr>";
    }
    echo "</table>";
    echo '</br>';
    echo '<table border="1">';
    

    probiert. Das funktionierte aber komischerweise fiel mir irgendwann auf, dass die Erste Zeile nicht ausgegeben wurde. Sprich es wurden nur 5 von 6 Werte ausgegeben. Kann es sein, dass wenn ich erst print_r($Tab2); und dann den "ausgabecode" nutze er die erste zeile überspringt?

    Weiterhin müsste doch ein mehr dimensionales array bei der abfrage entstehen, da ja die Einträge in der Tabelle 2 in mehreren Zeilen stehen, oder? Doch mit einem echo , der Form:

    echo $Tab2[0][0];
    echo $Tab2[1][0];
    .
    .
    .
    

    bekomme ich auch keine vernünftigen Werte zurück.

    Ja, dabei bräucht ich etwas Hilfe, Vielen Dank schonmal.

    Gruß Jo

    1. Mensch sowas,

      Den Left JOIN hab ich grad hingekriegt, die falschen Anführungszeichen.. :/.

      Aber das Problem bleibt das bei der Ausgabe mit:

      print_r ($arr);
      

      nur die erste Zeile ausgegeben wird und mit:

      echo '<table border="1">';
      while ($arr = mysql_fetch_array($result))
      {
      	echo "<tr>";
      	echo "<td>". $arr['wert1'] . "</td>";
      	echo "<td>". $arr['wert2'] . "</td>";
      	echo "<td>". $arr['wert3'] . "</td>";
      	echo "</tr>";
      }
      echo "</table>";
      echo '</br>';
      echo '<table border="1">';
      

      die erste Zeile fehlt.

      Und ich verstehe nicht warum :(

      Gruß

      1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

        Mensch sowas,

        Den Left JOIN hab ich grad hingekriegt, die falschen Anführungszeichen.. :/.

        Aber das Problem bleibt das bei der Ausgabe mit:

        print_r ($arr);
        

        Wie sind denn die Daten für das print_r() in das $arr reingekommen?

        nur die erste Zeile ausgegeben wird und mit:

        Und dann hast Du hier gleich weitergemacht?
        Oder hat dieses fetch mit dem oberen nichts zu tun?

        echo '<table border="1">';
        while ($arr = mysql_fetch_array($result))
        {
        	echo "<tr>";
        	echo "<td>". $arr['wert1'] . "</td>";
        	echo "<td>". $arr['wert2'] . "</td>";
        	echo "<td>". $arr['wert3'] . "</td>";
        	echo "</tr>";
        }
        echo "</table>";
        echo '</br>';
        echo '<table border="1">';
        

        die erste Zeile fehlt.

        Und ich verstehe nicht warum :(

        Gruß

        Spirituelle Grüße
        Euer Robert
        robert.r@online.de

        --
        Möge der wahre Forumsgeist ewig leben!
        1. Hey,

          print_r ($arr);
          

          Wie sind denn die Daten für das print_r() in das $arr reingekommen?

          Das kommt hier her:

          $query = "SELECT `Tab1`.`Wert1`,`Tab1`.`Wert2`,`Tab2`.`Wert3` FROM `Tab1` LEFT JOIN `Tab1` ON (`Tab2`.`var`=`Tab1`.`var`) WHERE `Tab1`.`var`=$i";
          $result = mysql_query($query);
          $arr = mysql_fetch_array($result);
          

          Und dann hast Du hier gleich weitergemacht?
          Oder hat dieses fetch mit dem oberen nichts zu tun?

          echo '<table border="1">';
          while ($arr = mysql_fetch_array($result))
          {
          	echo "<tr>";
          	echo "<td>". $arr['wert1'] . "</td>";
          	echo "<td>". $arr['wert2'] . "</td>";
          	echo "<td>". $arr['wert3'] . "</td>";
          	echo "</tr>";
          }
          echo "</table>";
          echo '</br>';
          echo '<table border="1">';
          

          Das :

          $arr = mysql_fetch_array($result)
          

          hab ich auskommentiert wenn ich den "ausgabecode" nutze.

          Alle Werte in Tab1 und Tab2 sind Floats. "Komischerweise scheint es so, dass in dem array Varchar oder Intenger stehen, bin mir nicht ganz sicher." (Bin mir nicht mal sicher ob das überhaupt stimmen kann.)

          denn eine ausgabe mit:

          echo $arr['wert1'][0];
          echo $arr['wert1'][1];
          echo $arr['wert1'][2];
          

          zeigt mir jede Stelle eines Floats an als [0]=> zahl, [1]=>. , [2]=>zahl,....

          Gruß

          1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

            Hey,

            print_r ($arr);
            

            Wie sind denn die Daten für das print_r() in das $arr reingekommen?

            Das kommt hier her:

            $query = "SELECT `Tab1`.`Wert1`,`Tab1`.`Wert2`,`Tab2`.`Wert3` FROM `Tab1` LEFT JOIN `Tab1` ON (`Tab2`.`var`=`Tab1`.`var`) WHERE `Tab1`.`var`=$i";
            $result = mysql_query($query);
            $arr = mysql_fetch_array($result);
            

            Da hast Du auch nur die erste Zeile aus dem Resultset abgeholt. Du würdest hier zum übertragen ins Arrey genau so eine Schleife brauchen, wie unten.

            Und dann hast Du hier gleich weitergemacht?
            Oder hat dieses fetch mit dem oberen nichts zu tun?

            echo '<table border="1">';
            while ($arr = mysql_fetch_array($result))
            {
            	echo "<tr>";
            	echo "<td>". $arr['wert1'] . "</td>";
            	echo "<td>". $arr['wert2'] . "</td>";
            	echo "<td>". $arr['wert3'] . "</td>";
            	echo "</tr>";
            }
            echo "</table>";
            echo '</br>';
            echo '<table border="1">';
            

            Das :

            $arr = mysql_fetch_array($result)
            

            hab ich auskommentiert wenn ich den "ausgabecode" nutze.

            Ok. Dann kann aber bei der unteren Schleife kein Datensatz fehlen.

            Alle Werte in Tab1 und Tab2 sind Floats.

            Da ich deine Werte nicht kenne, kann ich dazu nichts sagen. Die Typerhaltung von MySQL nach PHP ist eigentlich weitgehend gewährleistet. Wenn anstelle von print_r() mal var_dump() benutzt, sollten dir die Typen auch angezeigt werden.

            Bei der Ausgabe fehlt aber die kontextgerechte Behandlung mit htmlspecialchars()

            "Komischerweise scheint es so, dass in dem array Varchar oder Intenger stehen, bin mir nicht ganz sicher." (Bin mir nicht mal sicher ob das überhaupt stimmen kann.)

            denn eine ausgabe mit:

            echo $arr['wert1'][0];
            echo $arr['wert1'][1];
            echo $arr['wert1'][2];
            

            zeigt mir jede Stelle eines Floats an als [0]=> zahl, [1]=>. , [2]=>zahl,....

            Gruß

            Spirituelle Grüße
            Euer Robert
            robert.r@online.de

            --
            Möge der wahre Forumsgeist ewig leben!
            1. hey,

              Das kommt hier her:

              $query = "SELECT `Tab1`.`Wert1`,`Tab1`.`Wert2`,`Tab2`.`Wert3` FROM `Tab1` LEFT JOIN `Tab1` ON (`Tab2`.`var`=`Tab1`.`var`) WHERE `Tab1`.`var`=$i";
              $result = mysql_query($query);
              $arr = mysql_fetch_array($result);
              

              Da hast Du auch nur die erste Zeile aus dem Resultset abgeholt. Du würdest hier zum übertragen ins Arrey genau so eine Schleife brauchen, wie unten.

              Das sollte eine 1:n verbindung sein zu dem Werte paar aus Tab1 kommen mehrere Zeilen in Tab2, in phpmyadmin wird die resultierende tabelle aus der Abfrage korrekt angezeigt. Und dementsprechend würden die Daten doch auch in einem Mehrdimensionalen Array gespeichert werden, oder?

              Und dann hast Du hier gleich weitergemacht?
              Oder hat dieses fetch mit dem oberen nichts zu tun?

              echo '<table border="1">';
              while ($arr = mysql_fetch_array($result))
              {
              	echo "<tr>";
              	echo "<td>". $arr['wert1'] . "</td>";
              	echo "<td>". $arr['wert2'] . "</td>";
              	echo "<td>". $arr['wert3'] . "</td>";
              	echo "</tr>";
              }
              echo "</table>";
              echo '</br>';
              echo '<table border="1">';
              

              Das :

              $arr = mysql_fetch_array($result)
              

              hab ich auskommentiert wenn ich den "ausgabecode" nutze.

              Ok. Dann kann aber bei der unteren Schleife kein Datensatz fehlen.

              Tut es aber leider, und das versteh ich nicht.

              Alle Werte sind Floats.

              Einfache Zahlen zwischen 0.1 bis 40, mit max 3 Nachkommastellen.

              Da ich deine Werte nicht kenne, kann ich dazu nichts sagen. Die Typerhaltung von MySQL nach PHP ist eigentlich weitgehend gewährleistet. Wenn anstelle von print_r() mal var_dump()
              benutzt, sollten dir die Typen auch angezeigt werden.

              Bei der Ausgabe fehlt aber die kontextgerechte Behandlung mit htmlspecialchars()

              Da kann ich dir grad nicht folgen. Da ist mein Vokabular beschränkt, sry^^.

              Gruß Jo

              1. Liebe Mitdenker, liebe Wissende, liebe Neugierige,

                ich hab jetzt gerade nur mein Tablet, da kann ich Dir nicht wirklich gut helfen, weil ich dazu mehrere echte Fenster benötigen würde. Ich geb Dir aber schon mal ein paar Links

                Bei der Ausgabe fehlt aber die kontextgerechte Behandlung mit htmlspecialchars()

                Da kann ich dir grad nicht folgen. Da ist mein Vokabular beschränkt, sry^^.

                http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel

                http://wiki.selfhtml.org/wiki/Datenbank/Fortgeschrittene_Jointechniken

                und Du solltest wenigstens auf mysqli umstellen:
                http://php.net/manual/en/book.mysqli.php

                Der Join müsste auch "renoviert" werden. Dazu bei Bedarf morgen mehr ;-)

                Spirituelle Grüße
                Euer Robert
                robert.r@online.de

                --
                Möge der wahre Forumsgeist ewig leben!
              2. Hallo Jo,

                Das sollte eine 1:n verbindung sein zu dem Werte paar aus Tab1 kommen mehrere Zeilen in Tab2, in phpmyadmin wird die resultierende tabelle aus der Abfrage korrekt angezeigt. Und dementsprechend würden die Daten doch auch in einem Mehrdimensionalen Array gespeichert werden, oder?

                Bei einem JOIN wird ein karthesisches Produkt aus der linken Zeile und den zu joinenden Zeilen gebildet. Wenn du also eine 1:n-Verbindung hast, dann bekommst du für jede n-Zeile eine Zeile in Result-Set. Beispiel:

                CREATE TABLE t1 (
                  id INTEGER PRIMARY KEY
                );
                
                CREATE TABLE t2 (
                  id INTEGER PRIMARY KEY,
                  t1_id INTEGER NOT NULL REFERENCES t1(id)
                );
                
                INSERT INTO t1 (id) VALUES (1);
                INSERT INTO t2 (id, t1_id) VALUES (1, 1);
                INSERT INTO t2 (id, t1_id) VALUES (2, 1);
                
                SELECT * FROM t1 LEFT JOIN t2 ON t1_id = t1.id;
                

                Das gibt dieses Resultset:

                id | id | t1_id 
                ----+----+-------
                  1 |  1 |     1
                  1 |  2 |     1
                (2 rows)
                

                Ich weiss jetzt nicht, was PHPMyAdmin da macht, aber wenn es etwas anderes darstellt, dann ist das eine Aufbereitung dessen, was die Datenbank liefert. Du musst also, um alle Zeilen zu bekommen, mysql_fetch_array so oft aufrufen, bis es FALSE zurück gibt. Jede Zeile enthält dann die Zeile aus der ersten Tabelle und eine weitere Zeile aus der zweiten Tabelle.

                LG,
                CK

                1. Morgen Christian,

                  Das sollte eine 1:n verbindung sein zu dem Werte paar aus Tab1 kommen mehrere Zeilen in Tab2, in phpmyadmin wird die resultierende tabelle aus der Abfrage korrekt angezeigt. Und dementsprechend würden die Daten doch auch in einem Mehrdimensionalen Array gespeichert werden, oder?

                  Bei einem JOIN wird ein karthesisches Produkt aus der linken Zeile und den zu joinenden Zeilen gebildet. Wenn du also eine 1:n-Verbindung hast, dann bekommst du für jede n-Zeile eine Zeile in Result-Set. Beispiel:

                  CREATE TABLE t1 (
                    id INTEGER PRIMARY KEY
                  );
                  
                  CREATE TABLE t2 (
                    id INTEGER PRIMARY KEY,
                    t1_id INTEGER NOT NULL REFERENCES t1(id)
                  );
                  
                  INSERT INTO t1 (id) VALUES (1);
                  INSERT INTO t2 (id, t1_id) VALUES (1, 1);
                  INSERT INTO t2 (id, t1_id) VALUES (2, 1);
                  
                  SELECT * FROM t1 LEFT JOIN t2 ON t1_id = t1.id;
                  

                  Das gibt dieses Resultset:

                  id | id | t1_id 
                  ----+----+-------
                    1 |  1 |     1
                    1 |  2 |     1
                  (2 rows)
                  

                  Ich weiss jetzt nicht, was PHPMyAdmin da macht, aber wenn es etwas anderes darstellt, dann ist das eine Aufbereitung dessen, was die Datenbank liefert.

                  phpMyAdmin macht genau das. Das ist auch gut so und genau das möcht ich erstmal erreichen.

                  Du musst also, um alle Zeilen zu bekommen, mysql_fetch_array so oft aufrufen, bis es FALSE zurück gibt. Jede Zeile enthält dann die Zeile aus der ersten Tabelle und eine weitere Zeile aus der zweiten Tabelle.

                  $i = 1;
                  $query = "SELECT `Tab1`.`Wert1`,`Tab1`.`Wert2`,`Tab2`.`Wert3` FROM `Tab1` LEFT JOIN `Tab1` ON (`Tab2`.`var`=`Tab1`.`var`) WHERE `Tab1`.`var`=$i";
                  $result = mysql_query($query);
                  
                  echo '<table border="1">';
                  while ($arr = mysql_fetch_array($result))
                  {
                          echo "<tr>";
                          echo "<td>". $arr['wert1'] . "</td>";
                          echo "<td>". $arr['wert2'] . "</td>";
                          echo "<td>". $arr['wert3'] . "</td>";
                          echo "</tr>";
                  }
                  echo "</table>";
                  echo '</br>';
                  echo '<table border="1">';
                  

                  Soweit zur Ausgabe. Aber die braucht man ja nicht immer, wie krieg ich das in ein mehrdimensionales Array bei dem ich jeden Wert (Float) einzeln ansprechen kann? Denn dann kann ich mich wieder meinem Anfangsproblem witmen... Nachdem ich dann alles auf MySQLi umgeschrieben hab.

                  Gruß

                  Jo

                  1. Hallo Jo,

                    $i = 1;
                    $query = "SELECT `Tab1`.`Wert1`,`Tab1`.`Wert2`,`Tab2`.`Wert3` FROM `Tab1` LEFT JOIN `Tab1` ON (`Tab2`.`var`=`Tab1`.`var`) WHERE `Tab1`.`var`=$i";
                    $result = mysql_query($query);
                    
                    echo '<table border="1">';
                    while ($arr = mysql_fetch_array($result))
                    {
                            echo "<tr>";
                            echo "<td>". $arr['wert1'] . "</td>";
                            echo "<td>". $arr['wert2'] . "</td>";
                            echo "<td>". $arr['wert3'] . "</td>";
                            echo "</tr>";
                    }
                    echo "</table>";
                    echo '</br>';
                    echo '<table border="1">';
                    

                    Soweit zur Ausgabe. Aber die braucht man ja nicht immer, wie krieg ich das in ein mehrdimensionales Array

                    Welche Form soll denn Dein "mehrdimensionales Array" haben?

                    Grundsätzlich kannst Du Dir vorstellen, dass $result bereits ein "mehrdimensionales Array" ist. Mit Hilfe von mysql_fetch_array() & Co kannst Du dann auf dieses Array zugreifen. Jedesmal wenn Du die Funktion aufrufst bekommst Du den nächsten Datensatz (also sozusagen den nächsten Eintrag im "mehrdimensionalen Array").

                    Direkt alle Datensätze in einem Array auszugeben ist meines Wissens nach mit den MySQL-Funktionen nicht möglich, mit MySQLi (s.u.) sollte es gehen.

                    Wenn Du alle Datensätze in einem "richtigen" Array haben willst, musst Du es Dir (bei Verwendung der MySQL-Funktionen) selbst zusammenbauen.

                    Oder suchst Du so etwas wie den Gruppenwechsel?

                    An alle: Haben wir im Wiki schon einen Artikel zum Gruppenwechsel?

                    bei dem ich jeden Wert (Float) einzeln ansprechen kann?

                    Du kannst auch jetzt schon jeden Wert einzeln ansprechen, egal von welchem Datentyp er ist. Was meinst Du damit? Beziehst Du Dich auf Deine Frage aus diesem Post? Zitat:

                    denn eine ausgabe mit:

                    echo $arr['wert1'][0];
                    echo $arr['wert1'][1];
                    echo $arr['wert1'][2];
                    

                    zeigt mir jede Stelle eines Floats an als [0]=> zahl, [1]=>. , [2]=>zahl,....

                    Hier kommt ein bisschen "PHP-Magie" ins Spiel. PHP hat eine automatische Typenumwandlung. Und Strings in PHP wiederum sind ein Array ihrer einzelnen Zeichen. In $arr['wert1'] steht jetzt also beispielsweise 1.23, dann greifst Du mit $arr['wert1'][0] auf ein Array zu. PHP wandelt Deinen Float in einen String um und gibt Dir das erste Zeichen (PHP-Arrays sind nullbasiert), hier 1 zurück.

                    Denn dann kann ich mich wieder meinem Anfangsproblem witmen... Nachdem ich dann alles auf MySQLi umgeschrieben hab.

                    MySQLi ist definitiv die bessere Wahl. Wenn Du MySQLi verwendest, kannst Du Dir auch mit mysqli_result::fetch_all direkt ein "mehrdimensionales Array" zurückgeben lassen - falls es das ist, was Du suchst.

                    Gruß Dennis

                    1. Tach!

                      An alle: Haben wir im Wiki schon einen Artikel zum Gruppenwechsel?

                      An Dennis: Wir haben im Wiki eine Suchfunktion. ;)

                      Denn dann kann ich mich wieder meinem Anfangsproblem witmen... Nachdem ich dann alles auf MySQLi umgeschrieben hab.

                      MySQLi ist definitiv die bessere Wahl.

                      Ich empfehle PDO, das ist anwenderfreundlicher, solange man keine Spezial-Funktionalität braucht, die nur mit mysqli ansprechbar ist.

                      dedlfix.

                      1. Hey dedlfix,

                        An alle: Haben wir im Wiki schon einen Artikel zum Gruppenwechsel?

                        An Dennis: Wir haben im Wiki eine Suchfunktion. ;)

                        die hab ich ja auch wie üblich benutzt :-) Wonach muss ich denn suchen? "Gruppenwechsel" ergibt weder bei "Suchen" noch "Seite" einen Treffer. Deswegen fragte ich ja ;-) Wenn es schon einen Artikel gibt, würde ich eine Weiterleitung einrichten, damit auch ich das finden kann :-)

                        Denn dann kann ich mich wieder meinem Anfangsproblem witmen... Nachdem ich dann alles auf MySQLi umgeschrieben hab.

                        MySQLi ist definitiv die bessere Wahl.

                        Ich empfehle PDO, das ist anwenderfreundlicher, solange man keine Spezial-Funktionalität braucht, die nur mit mysqli ansprechbar ist.

                        Dem kann ich mich anschließen, da wären wir dann im Gegensatz zur "besseren Wahl MySQLi" bei der "wohl besten Wahl PDO" :-)

                        Gruß Dennis

                        1. Tach!

                          An alle: Haben wir im Wiki schon einen Artikel zum Gruppenwechsel?

                          An Dennis: Wir haben im Wiki eine Suchfunktion. ;)

                          die hab ich ja auch wie üblich benutzt :-) Wonach muss ich denn suchen? "Gruppenwechsel" ergibt weder bei "Suchen" noch "Seite" einen Treffer. Deswegen fragte ich ja ;-) Wenn es schon einen Artikel gibt, würde ich eine Weiterleitung einrichten, damit auch ich das finden kann :-)

                          Wenn es keine Seite mit dem Suchbegriff als Titel gibt, dann sucht die Suche im Inhalt weiter. Wenn da keine Treffer kommen, gibts das Wort nirgendwo. Es sei denn, es steht in irgendwelchen nebensächlichen Namensräumen, die von der Suche ausgeschlossen sind.

                          dedlfix.

                          1. Hey dedlfix,

                            An alle: Haben wir im Wiki schon einen Artikel zum Gruppenwechsel?

                            An Dennis: Wir haben im Wiki eine Suchfunktion. ;)

                            die hab ich ja auch wie üblich benutzt :-) Wonach muss ich denn suchen? "Gruppenwechsel" ergibt weder bei "Suchen" noch "Seite" einen Treffer. Deswegen fragte ich ja ;-) Wenn es schon einen Artikel gibt, würde ich eine Weiterleitung einrichten, damit auch ich das finden kann :-)

                            Wenn es keine Seite mit dem Suchbegriff als Titel gibt, dann sucht die Suche im Inhalt weiter. Wenn da keine Treffer kommen, gibts das Wort nirgendwo. Es sei denn, es steht in irgendwelchen nebensächlichen Namensräumen, die von der Suche ausgeschlossen sind.

                            ja, danke. Wollte nur sichergehen, dass ich nichts übersehen habe. Hab den Wink aber verstanden: Wird erledigt :-)

                            Gruß Dennis

                    2. Moin Dennis,

                      Ja bin gerade dabei alle MySQL Funktionen in MySQLi umzuschreiben, obwohl ich mit diesem "Objektorientiert" irgendwie nichts mit anfangen kann.

                      Vom Typ her hätte ich gern Array wie die Tabelle die bei der Ausgabe erscheint sprich eine Matrix, wo man mit spalten und zeilen index den entsrechenden Wert erhält. Was dann ja für die weiteren Rechenschritte nützlich wäre zu wissen mit welchem Wert man gerade arbeitet.

                      Das werd ich heute mal in Angriff nehmen falls ich mit dem "kleinen zwischendurch Problem" vorm Mittag fertig werde.

                      Gruß Jo

                      1. Hallo Jo,

                        Ja bin gerade dabei alle MySQL Funktionen in MySQLi umzuschreiben, obwohl ich mit diesem "Objektorientiert" irgendwie nichts mit anfangen kann.

                        das lässt sich ändern. Wenn Du da mit etwas konkretem Probleme hast frag einfach nach. Objektorientierung ist gar nicht schwer, wenn man das grundlegende Prinzip einmal verstanden hat. Wenn Du noch nicht allzu viel geändert hast und Dich eh erst zurecht finden musst: Beachte auch den Hinweis von dedlfix und verwende am besten direkt PDO, der Lernaufwand sollte gleich sein, nur dass Dir PDO mehr Vorteile bietet.

                        Vom Typ her hätte ich gern Array wie die Tabelle die bei der Ausgabe erscheint sprich eine Matrix, wo man mit spalten und zeilen index den entsrechenden Wert erhält. Was dann ja für die weiteren Rechenschritte nützlich wäre zu wissen mit welchem Wert man gerade arbeitet.

                        So eine "Tabelle" in Array-Form hast Du bereits vorliegen, hat Christian Dir auch schon geschrieben. Das kannst Du Dir auch ganz einfach anzeigen lassen:

                        $array = array();
                        
                        while ($arr = mysql_fetch_array($result) {
                            $array[] = $arr;
                        }
                        
                        var_dump($array);
                        

                        Gruß Dennis

                        1. Servus zusammen,

                          So eine "Tabelle" in Array-Form hast Du bereits vorliegen, hat Christian Dir auch schon geschrieben. Das kannst Du Dir auch ganz einfach anzeigen lassen:

                          $array = array();
                          
                          while ($arr = mysql_fetch_array($result) {
                              $array[] = $arr;
                          }
                          
                          var_dump($array);
                          

                          Ja das stimmt wohl, dass ich ein solches Array habe. Aber ich kann die Werte nicht einzeln ansprechen. Kann ich diese Typumwandlung rückgängig machen oder manuel vornehmen/umkehren?

                          Gruß

                          1. Hallo Jo,

                            So eine "Tabelle" in Array-Form hast Du bereits vorliegen, hat Christian Dir auch schon geschrieben. Das kannst Du Dir auch ganz einfach anzeigen lassen:

                            $array = array();
                            
                            while ($arr = mysql_fetch_array($result) {
                                $array[] = $arr;
                            }
                            
                            var_dump($array);
                            

                            Ja das stimmt wohl, dass ich ein solches Array habe. Aber ich kann die Werte nicht einzeln ansprechen.

                            Wieso kannst Du die nicht einzeln ansprechen? Worin genau besteht das Problem? Zeig uns am besten mal wie Dein var_dump($array) in diesem Fall aussieht und wie Du versuchst darauf zuzugreifen.

                            Mal zusätzlich ins Blaue hinein geraten: Dir ist bewusst, dass $array[0][1] etwas anderes als $array[1][0] und $array['name'][0] etwas anderes als $array[0]['name'] ist? Ein var_dump() sollte Dir jedenfalls immer anzeigen, wie das Array aussieht und Du solltest so sehen können, wie Du darauf zugreifen kannst. Weiterer Tipp: Guck Dir die Ausgabe von var_dump() in der Quelltext-Anzeige des Browsers an oder lass ein <pre> vor var_dump() ausgeben.

                            Kann ich diese Typumwandlung rückgängig machen oder manuel vornehmen/umkehren?

                            Jein. Grundsätzlich kann man Typen ändern ("cast" genannt), das ändert aber nichts an der automatischen Typ-Änderung von PHP, wenn man (falsch) auf ein Element zugreift. Ich denke aber auch nicht, dass das in Deinem Fall das Problem ist.

                            Gruß Dennis

                            1. Hey,

                              Wieso kannst Du die nicht einzeln ansprechen? Worin genau besteht das Problem? Zeig uns am besten mal wie Dein var_dump($array) in diesem Fall aussieht und wie Du versuchst darauf zuzugreifen.

                              Mal zusätzlich ins Blaue hinein geraten: Dir ist bewusst, dass $array[0][1] etwas anderes als $array[1][0] und $array['name'][0] etwas anderes als $array[0]['name'] ist? Ein var_dump() sollte Dir jedenfalls immer anzeigen, wie das Array aussieht und Du solltest so sehen können, wie Du darauf zugreifen kannst. Weiterer Tipp: Guck Dir die Ausgabe von var_dump() in der Quelltext-Anzeige des Browsers an oder lass ein <pre> vor var_dump() ausgeben.

                              array(6) { [0]=> array(6) { [0]=> string(7) "1.16416" ["minhz"]=> string(7) "1.16416" 
                                                                           [1]=> string(6) "2.2193" ["maxhz"]=> string(6) "2.2193" 
                                                                           [2]=> string(4) "5.32" ["radius"]=> string(4) "5.32" }
                                               [1]=> array(6) { [0]=> string(7) "1.16416" ["minhz"]=> string(7) "1.16416" 
                                                                           [1]=> string(6) "2.2193" ["maxhz"]=> string(6) "2.2193" 
                                                                           [2]=> string(6) "33.635" ["radius"]=> string(6) "33.635" } 
                                               [2]=> array(6) { [0]=> string(7) "1.16416" ["minhz"]=> string(7) "1.16416" 
                                                                           [1]=> string(6) "2.2193" ["maxhz"]=> string(6) "2.2193" 
                                                                           [2]=> string(5) "0.334" ["radius"]=> string(5) "0.334" } 
                                               [3]=> array(6) { [0]=> string(7) "1.16416" ["minhz"]=> string(7) "1.16416" 
                                                                           [1]=> string(6) "2.2193" ["maxhz"]=> string(6) "2.2193" 
                                                                           [2]=> string(5) "1.008" ["radius"]=> string(5) "1.008" } 
                                               [4]=> array(6) { [0]=> string(7) "1.16416" ["minhz"]=> string(7) "1.16416" 
                                                                           [1]=> string(6) "2.2193" ["maxhz"]=> string(6) "2.2193" 
                                                                           [2]=> string(5) "0.712" ["radius"]=> string(5) "0.712" } 
                                               [5]=> array(6) { [0]=> string(7) "1.16416" ["minhz"]=> string(7) "1.16416" 
                                                                           [1]=> string(6) "2.2193" ["maxhz"]=> string(6) "2.2193" 
                                                                           [2]=> string(5) "7.103" ["radius"]=> string(5) "7.103" } } 
                              

                              So sieht beispielhaft das Array aus, mit var_dump() ausgegeben. und ja ich weiß wo ich mit $array[0][1] lande. Ich brauch halt ein Float mit dem ich rechnen kann und kein String mit dem lässt sich etwas schwierig rechnen.

                              Gruß

                            2. Ich Fall vom Pferd, jetzt gehts 0o

                              1. Hallo Jo,

                                Ich Fall vom Pferd, jetzt gehts 0o

                                Lässt Du uns dran teilhaben, warum es "jetzt geht"? Richtige Indizierung verwendet? ;-)

                                Gruß Dennis

                                1. Hey,

                                  Lässt Du uns dran teilhaben, warum es "jetzt geht"? Richtige Indizierung verwendet? ;-)

                                  Ne hab die gleiche Indizierung verwendet wie vorher auch... hab aber immer nur die "Stringstellen" angezeigt bekommen, aber nun krieg ich den gesamten Float zurück. Frag mich nicht warum, ich hab die echos immer nur aus bzw. ein kommentiert.

                                  Gruß

                                  1. Hallo Jo,

                                    Lässt Du uns dran teilhaben, warum es "jetzt geht"? Richtige Indizierung verwendet? ;-)

                                    Ne hab die gleiche Indizierung verwendet wie vorher auch... hab aber immer nur die "Stringstellen" angezeigt bekommen, aber nun krieg ich den gesamten Float zurück. Frag mich nicht warum, ich hab die echos immer nur aus bzw. ein kommentiert.

                                    ganz ehrlich: Ich glaube nicht. Und vorneweg: Mir ist das egal und ich freue mich, wenn es bei Dir funktioniert. Egal wie. Aber für andere, die eventuell das gleiche Problem wie Du haben, wäre es wohl hilfreich, eine Lösung zu sehen. Ich tippe also darauf, dass Du sowas hattest (und korrigiere mich bitte, wenn ich falsch liege):

                                    $array = array();
                                    $array[0] = 'test';
                                    
                                    // In diesem Fall richtiger Zugriff
                                    echo $array[0]; // ergibt 'test'
                                    
                                    // In diesem Fall falscher Zugriff
                                    echo $array[0][0]; // ergibt, aufgrund von ein bisschen "PHP-Magie", 't'
                                    

                                    Bei tiefer verschachtelten Arrays und auch, wenn in $array[0] eine Zahl stehen würde, natürlich äquivalent.

                                    Gruß Dennis

                                    1. Hallöle,

                                      Ne hab die gleiche Indizierung verwendet wie vorher auch... hab aber immer nur die "Stringstellen" angezeigt bekommen, aber nun krieg ich den gesamten Float zurück. Frag mich nicht warum, ich hab die echos immer nur aus bzw. ein kommentiert.

                                      ganz ehrlich: Ich glaube nicht. Und vorneweg: Mir ist das egal und ich freue mich, wenn es bei Dir funktioniert. Egal wie. Aber für andere, die eventuell das gleiche Problem wie Du haben, wäre es wohl hilfreich, eine Lösung zu sehen. Ich tippe also darauf, dass Du sowas hattest (und korrigiere mich bitte, wenn ich falsch liege):

                                      $array = array();
                                      $array[0] = 'test';
                                      
                                      // In diesem Fall richtiger Zugriff
                                      echo $array[0]; // ergibt 'test'
                                      
                                      // In diesem Fall falscher Zugriff
                                      echo $array[0][0]; // ergibt, aufgrund von ein bisschen "PHP-Magie", 't'
                                      

                                      Bei tiefer verschachtelten Arrays und auch, wenn in $array[0] eine Zahl stehen würde, natürlich äquivalent.

                                      Nein genau richtig.

                                      Es war spät gestern Abend... Ich hatte unlängst alles hintermir gelassen und wollte seelig einschlafen. Als plötzlich, wie aus dem nichts, mir die Antwort ins Gesicht sprang.

                                      while($arr = mysql_fetch_array($result))
                                      {
                                          $array[] = $arr;
                                      }
                                      

                                      Ohne das hier, sieht das Array auf den ersten Blick eindimensional aus. Beachtet man die Strings ergibt das echo genau wie du sagst die Stelle im String. Da es ja in wirklichkeit schon mehrdimensional ist. Mit der Schleife wird jedoch ein 'echtes' mehrdimensionales Array daraus und der Float wird mit dem 2ten Index angesprochen.

                                      Ein dritter Index (etwa echo $array[0][0][1]) würde jetzt die Stelle im String ausgeben.

                                      In diesem Sinne: Die Erkenntnis kommt, auch wenns etwas später wird :)

                                      So Morgen witme ich mich dann wieder dem Anfangsproblem. da bin ich mittlerweile hier:

                                      for($e = 0 ; $e < $count ; $e++)
                                      {
                                      	$abstand_unten = $array[$e][2] - $array[$e][0];
                                      	$abstand_oben = $array[$e][2] - $array[$e][1];
                                      	if ($abstand_unten < 0)
                                      	{
                                      		$abstand_be_unten = $abstand_unten * (-1);
                                      	}
                                      	else
                                      	{
                                      		$abstand_be_unten = $abstand_unten;
                                      	}
                                      	if ($abstand_unten < 0)
                                      	{
                                      		$abstand_be_oben = $abstand_oben * (-1);
                                      	}
                                      	else
                                      	{
                                      		$abstand_be_oben = $abstand_oben;
                                      	}
                                      	
                                      	if($abstand_be_unten < $abstand_be_oben and $abstand_be_oben < $abstand)
                                      	{
                                      		$abstand = $abstand_be_unten;
                                      		$radius_gesucht = $array[$e][2];
                                      	}
                                      	elseif($abstand_be_oben < $abstand_be_unten and $abstand_be_unten < $abstand)
                                      	{
                                      		$abstand = $abstand_be_oben;
                                      		$radius_gesucht = $array[$e][2];
                                      	}
                                      }
                                      echo $radius_gesucht;
                                      

                                      (oder so ähnlich) Aber das funktioniert noch nicht ganz richtig.

                                      Gruß Jo