Entwickler-Ecke

Programmiersprachen (Server) - [php]durschnittspreis


JungerIslaender - Sa 18.02.12 20:20
Titel: [php]durschnittspreis
Hi ich hab eine mysql Datenbank:

name picture price
Schuh meinpic.de 5; 10 ; 7

Nun möchte ich auf meiner Website den Artikel mit dem durchschnittspreis angeben.


Mfg JungerIslaender


Moderiert von user profile iconChristian S.: Topic aus Off Topic verschoben am So 15.07.2012 um 12:46


Martok - Sa 18.02.12 20:31

Ja, und?

Zitat:
a) was genau willst du?
b) was genau machst du?
c) was genau geschieht?
d) was genau an c) ist nicht wie in a) ???


Niko S. - Sa 18.02.12 20:39

Schätze mal die Preise sind mit dem ";" getrennt und er sucht nen weg die dort herauszufiltern.
Dann wäre "explode" die Funktion die du suchst.


JungerIslaender - Sa 18.02.12 20:51

D.h. ich übergebe dann den gesamten Datensatz Preis an eine Variable und


Quelltext
1:
2:
3:
4:
5:
6:
<?php
$preis  = "5; 10; 7;";
$temp = explode(";", $Preis);
echo $temp[0]; // 5
echo $temp[1]; // 10
?>


müsste ich dann nur noch den Durchschnitt ausrechnen.

Super vielen Dank


JungerIslaender - So 19.02.12 18:35

Ich muss das ganze leider doch noch mal aufrollen...

" müsste ich dann nur noch den Durchschnitt ausrechnen.

Super vielen Dank " hat sich nämlich doch nich als so leicht herausgestellt. Ich finde den Fehler nämlich nicht.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
$temp = explode(";", $zeile['price']);

for ($i = 0; $i < sizeof($temp); ++$i)
  {
  $durchschnittspreis = $durchschnittspreis + $temp[i];
  };
  
$durchschnittspreis = $durchschnittspreis / i ; //zeile 23



Quelltext
1:
Warning: Division by zero in /var/www/list.php on line 23                    


Martok - So 19.02.12 20:01

++$i in der Schleife sieht seltsam aus. Ist and der Stelle egal, aber ich würd immer $i++ schreiben... Auch aus Lesbarkeitsgründen wäre ich außerdem für count() statt sizeof(). sizeof ist ein Alias, aber verwirrend finde ich das schon.

Egal, dein Problem (was dir PHP auch ansagt, wenn du Hinweise aktivierst): Da fehlt ein Dollarzeichen.


Quelltext
1:
$durchschnittspreis = $durchschnittspreis / $i ; //zeile 23                    


JungerIslaender - Mo 20.02.12 17:51

Dammit, einfach nicht gesehehn. Danke! Wie aktiviere ich den Hinweise?

Edit: Funktioniert trotzdem nicht. echo $durchschnittspreis; Liefert 0


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
//Berechnen des Durchschnittspreises
$temp = explode(";", $zeile['price']);

for ($i = 0; $i < count($temp); $i++)
  {
  $durchschnittspreis = $durchschnittspreis + $temp[i];
  };
$durchschnittspreis = $durchschnittspreis / $i ;

echo '<table border="1">';
while ($zeile = mysql_fetch_array( $db_erg))
{
  echo "<tr>";
  echo "<td>". $zeile['name'] . "</td>";
  echo "<td>". $zeile['picture'] . "</td>";
  echo "<td>". $zeile['price'] . "</td>";
  echo "<td>". $durchschnittspreis . "</td>";
}
echo "</table>";


Ausgabe der Tabelle:

Quelltext
1:
Schuh    5; 10; 5; 10; 10;  0                    


Mir ist bewusst, dass $zeile['price'] noch keinen wert hat, sondern erst nach $zeile = mysql_fetch_array( $db_erg). Egal in welcher reihenfolge, der durchschnittspreis bleibt 0.


Yogu - Mo 20.02.12 18:03

Hallo,

du kannst in der Datei *php.ini* einstellen, was alles angezeigt werden soll. Dort müsste eine Zeile sein, die mit "error_reporting" anfängt. Die setzt du am besten auf:


Quelltext
1:
error_reporting = E_ALL | E_STRICT                    

Das aktiviert Warnungen, Hinweise und Hinweise bei veraltetem Code.

Füge direkt vor deinen Code folgende Zeile ein:


Quelltext
1:
var_dump($zeile);                    

Dadurch wird dir die Variable ausgegeben und du siehst, was genau da drin steht.


JungerIslaender - Mo 20.02.12 18:09

var_dump($zeile); liefert bool(false) nach ausgabe der Tabelle
und null vor ausgabe der Tabelle


Martok - Mo 20.02.12 18:49

Du kannst auch per Funktion error_reporting(E_ALL | E_STRICT) im laufenden Skript umschalten.

Dein Code macht keinen Sinn... sinniger wäre doch erst lesen, dann ausgeben?

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
echo '<table border="1">';
while ($zeile = mysql_fetch_array( $db_erg))
{
  echo "<tr>";
  echo "<td>". $zeile['name'] . "</td>";
  echo "<td>". $zeile['picture'] . "</td>";
  echo "<td>". $zeile['price'] . "</td>";
  //Berechnen des Durchschnittspreises
  $temp = explode(";", $zeile['price']);
  $durchschnittspreis = 0;
  for ($i = 0; $i < count($temp); $i++) {
    $durchschnittspreis = $durchschnittspreis + $temp[$i];
  }
  $durchschnittspreis = $durchschnittspreis / count($temp);

  echo "<td>". $durchschnittspreis . "</td>";
}
echo "</table>";

Siehe Highlight. Liest du deinen Code auch?

Ich sehe grad, dein "price" enthält auch noch Leerzeichen. Warum das dann geht ist mir nicht ganz klar. PHP eben.


JungerIslaender - Mo 20.02.12 19:28

Super danke. Manchmal seh ich das einfach nicht... Und php ist nun auch nicht grad meine beste programmiersprache.

MFG


Niko S. - Mo 20.02.12 19:33

Zitat:
Ich sehe grad, dein "price" enthält auch noch Leerzeichen. Warum das dann geht ist mir nicht ganz klar. PHP eben.

PHP ignoriert Whitespaces beim Konvertieren. Es soll eigentlich eben die ständige Prüfung nach Whitespaces abnehmen.
Ich glaube mit EStrict wäre das nicht so einfach möglich... Bin mir da aber nicht sicher.

Man könnte auch "einfacher" eine foreach schleife benutzen für die Array die aus Explode entsteht.
http://tut.php-q.net/de/ ist eigentlich mein Favorit wenn es um's lernen von PHP geht.


JungerIslaender - Mo 20.02.12 19:35

Die Leerzeichen hab ich in der Datenbank entfer. Wird jetzt nur noch durch ; getrennt.


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
echo '<table border="1">';
while ($zeile = mysql_fetch_array( $db_erg))
{
  echo "<tr>";
  echo "<td>". $zeile['name'] . "</td>";
  echo "<td>". $zeile['picture'] . "</td>";
  echo "<td>". $zeile['price'] . "</td>";
  //Berechnen des Durchschnittspreises
  $temp = explode(";", $zeile['price']);
  $durchschnittspreis = 0;
  for ($i = 0; $i < count($temp); $i++) {
    $durchschnittspreis = $durchschnittspreis + $temp[$i];
  }
  $durchschnittspreis = $durchschnittspreis / <span style="color: orange">(count($temp)-1)</span>;

  echo "<td>". $durchschnittspreis . "</td>";
}
echo "</table>";


Es fehlte noch das -1. Danke für den Link mit den Tutorials


Niko S. - Mo 20.02.12 20:01

Bist du dir da sicher dass das -1 da hin soll?
Wenn ich mich nicht irre:

Quelltext
1:
2:
3:
4:
5:
6:
$arr[0] = 2;
$arr[1] = 4;
$arr[2] = 6;

$durchschnitt = ($arr[0]+$arr[1]+$arr[2]) / count($arr);
// wobei count($arr) = 3 ist.


Oder kann ich nicht mehr zählen?


JungerIslaender - Di 21.02.12 15:25

Ansich hast du recht. In der Praxis ist es aber so(ka warum), dass count($arr) = 4 ist. Und mit dem -1 funktioniert alles wie beabsichtigt.


mvollmer - Di 21.02.12 16:43

Count() gibt auch die Anzahl der Elemente im Array aus und nicht den höchsten Index des Arrays.

user profile iconJungerIslaender hat folgendes geschrieben Zum zitierten Posting springen:


Quelltext
1:
2:
3:
4:
  for ($i = 0; $i < count($temp); $i++) {
    $durchschnittspreis = $durchschnittspreis + $temp[$i];
  }
  $durchschnittspreis = $durchschnittspreis / <span style="color: orange">(count($temp)-1)</span>;



Ich würde es auch lieber so schreiben:


Quelltext
1:
2:
3:
4:
  for ($i = 0; $i < count($temp)-1; $i++) {
    $durchschnittspreis = $durchschnittspreis + $temp[$i];
  }
  $durchschnittspreis = $durchschnittspreis / <span style="color: orange">(count($temp))</span>;


Yogu - Di 21.02.12 20:34

Alle Elemente zusammenzählen und dann durch die Anzahl teilen ist eigentlich schon der richtige Algorithmus, um den Mittelwert zu berechnen. Konkret:


C#-Quelltext
1:
for ($i = 0; $i < count($temp); i++)                    

ist korrekt, da die Anzahl drei sein sollte und i daher von 0 bis 2 (< 3) durchläuft. Anschließend teilst du durch die Anzahl, also 3.

Da der Algorithmus so stimmt, aber die Ausgabe unerwünscht ist, muss die Eingabe falsch sein. Deshalb würde ich wieder einmal var_dump einsetzen und $temp ausgeben. Ich denke, da ist ein leerer Eintrag dabei. Vermutlich enthält die Zeile price ein Semikolon am Anfang oder am Ende des Strings.


JungerIslaender - Di 21.02.12 20:45

Alles klar, ich hatte die Funktion ein bisschen anders verstanden. Ich dachte 5; 10; Wären jeweils elemente und nicht

5 ;10 ;3 ;5 ; so.

Demnach ist da ein Semikolon zuviel korrekt. Den Algorhitmus hab ich schon verstanden. Dasselbe ist in Delphi nichts neues für mich. Nur mit dem php haperts ein bisschen.