Sie befinden sich hier im Forenarchiv von phpforum.de wenn Sie direkt ins Forum möchten, klicken Sie bitte hier. Zur Startseite kommen Sie hier.

Berechnung $i;

Hallo ich habe folgende Frage.

Hier ist erstmal die Aufgabenstellung:

Ich soll die 10% besten Ergebnisse meiner Werte aus den DS ermitteln und davon den durchschnitt
ausrechnen also z.B.
wenn wir insg als Ergebnisse nach der Suche 80 Treffer haben dann die besten 8
Werte ermitteln aufsummieren und durch 8 Teilen

Code:                   In Zwischenablage kopieren (nur IE)
1">

Irgendwie haut das aber nicht richtig hin !
Hier gehts zum Orginal Eintrag "Berechnung $i;" im Forum

Antworten

Kann mir niemand helfen ?


2.

steiner, drängel doch nicht immer so, das ist jetzt schon der 3.te thread, wo ich von dir nach 20 minuten lesen muss "Kann mir denn keiner helfen?" ...

Hier machen das alle kostenlos und verbrauchen für die Probleme Anderer Ihre Zeit, daher kannst Du nicht darauf bestehen nach 10, 20 Minuten schon eine Antwort zu bekommen...

Sorry, das ganze soll jetzt nicht böse sein und ist auch nichts gegen dich persönlich, aber bitte drängel doch net immer ;)


3.

Ok, Entschuldigung


4.

Nur so nebenbei gesagt würd ich die Abrage schon umstellen ;)
Nehmen wir mal an die Spalte mit besagte Werten heisst result.
So nehmen wir weiter an es befinden sich 180 Werte in der DB.
Du willst die 10 grössten => also einfach noch ein ORDER BY result LIMIT 0, 10 in deinen Query und schon hast du das gewünschte Ergebnis ;)


5.

Klingt richtig, das Problem ist doch aber ich soll die 10% besten Ergebnisse anzeigen lassen, kann also nicht von vornherein mit limit mir nur 10 DS anzeigen lassen.

Die Spalte die ich brauche heißt "index2" - die Werte stehen im "index" - siehe oben.

Ich habe jetzt z.B. die Werte 50 und 70

Da müßte jetzt sozuagen bei meinem Top 10 "70" rauskommen, bei mir kommt aber "120" raus.

Hier nochmal der Code

Code:                   In Zwischenablage kopieren (nur IE)
2">

Sind dort erstmal Fehler drinne ? Stimmt die Berechnung nicht ?


6.

Code:                   In Zwischenablage kopieren (nur IE)
3">

Habe deinen bisherigen code nicht durchgelesen, aber so solltest du die ersten 10% bekommen.


7.

Danke, aber ich habe doch geschrieben, es koennte mal nur 10DS, mal 100DS, mal 1000DS immer abhängig von den Inhalten der DB ?

Ich habe z.B. 1000DS davon soll er mir die 100 besten anzeigen, zusammenrechnen und durch die Anzahl teilen, also durch 100 !


8.

Hi,

probiers mal so :
Code:                   In Zwischenablage kopieren (nur IE)
4">

Gruß Fex


9.

Hi, das 'wert ' muss doch bestimmt ersetzt werden, aber mit welchem ? Ist das bei mir das $index oder wie ?


10.

So ich habe hier nochmal den kompletten Code, habe es so gemacht wie du beschrieben und so gemacht wie ich gedacht :-), Ergebnisse = 0, bei $t10avg

Code:                   In Zwischenablage kopieren (nur IE)
5">

Alle anderen Ergebnisse hauen hin, bloss halt nicht $t10avg.


11.

Hi,

irgendwie hab ich ein Problem deien Gedanken nachzuvollziehen. Nehme mal in deinem Statments die von mir gemachten Änderungen vor. Wobei an Stelle von ps.*, p.* du genau das Feld ausgibst, für welches du dann $t10avg berechnen willst, bei mir hier wert genannt.
Die Ausgabe sortierst du dann absteigend nach diesem Feld.
Code:                   In Zwischenablage kopieren (nur IE)
6">

Gruß Fex


12.

So habe das jetzt umgeändert, funktioniert trotzdem nicht !

Code:                   In Zwischenablage kopieren (nur IE)
7">

Ergebniss $t10avg bleibt null

Lasse mir $inhalt ausgeben, das ist "richtiger Weise" 70 - - > Array ( [0] => 70 [ind_uaw] => 70 )

Lasse ich mir $t10sum ausgeben, das ist das Ergebniss = 0;

Irgendwas stimmt hier nicht :-(


13.

Hi,

welchen Wert hat denn $index? So wie es jetzt im SQL-Statment steht, ist es eine php-Variable. Schreibe doch erst mal nur den Feldnamen des Feldes in das Statment, welche die Werte enthält, aus denen du den Durchschnittswert berechnen willst; eventuell mit Tabellenpräfix, also ps.feld as avg_feld oder p.feld as avg_feld.
In der for-Schleife läßt du dir dann $inhalt['feld'] bzw. $inhalt['avg_feld']; ausgeben und nicht $inhalt['$index'].

Gruß Fex


14.

$index ist der Feldname. Deswegen habe ich ja geschrieben,

Code:                   In Zwischenablage kopieren (nur IE)
8">

Weis halt nicht, ob es mit in die while-Schleife reinkommt, oder gesondert

Code:                   In Zwischenablage kopieren (nur IE)
9">




15.

Du solltest unbedingt mal an den Anfang des Scriptes die Zeile
Code:                   In Zwischenablage kopieren (nur IE)
10">

einbauen, mal sehen, ob PHP dann was zu meckern hat.

*** Nobody ***


16.

Heißt der Feldname in der MySQL-Tabelle tatsächlich $index, wobei ich mir jetzt nicht im klaren bin, ob das $-Zeichen überhaupt in einem Feldnamen zulässig ist??? oder ist das jetzt eine Variable!??

Bei ersterem hätte ich jetzt mal auf mindestens eine Fehlermeldung getippt. Im zweiten Fall dürfte diese Anweisung Probleme bereiten:

$index2 = htmlspecialchars($inhalt[$index]);
$t10sum += $inhalt['$index2'];

Mal davon abgesehen, dass htmlspecialchars() hier etwas deplaziert ist, müßte es

$index2 = htmlspecialchars($inhalt[$index]);
$t10sum += $index2;

heißen. Ansonsten brauchst du die while-Schleife hier nicht, du willst ja nur 10% der Werte verarbeiten, da reicht die for-Schleife.

EDIT: Der Tipp von Nobody ist goldrichtig, hab im Moment selbst nicht daran gedacht ;)


17.

So habe das mal gemacht, hier nochmal mein aktueller Quellcode.

Code:                   In Zwischenablage kopieren (nur IE)
11">

Habe jetzt mal "error_reporting(E_ALL); " eingebaut, folgende Fehler bringt er:Notice:

Code:                   In Zwischenablage kopieren (nur IE)
12">




18.

Puuh, das sind niemals die Fehlermeldungen, die du bekommst!!!! Glaubst du wirklich, dass es Sinn macht, Fehlermeldungen zerstückelt zu posten??? Und wenn du die kompletten Fehlermeldungen postest, wäre es nicht schlecht, wenn man erkennen kann, in welcher Zeile von deinem hier geposteten Quellcode die Rede ist.

Zur Info: Solche Notice-Meldungen deuten auf eine unsaubere, um nicht zu sagen schlampige, Programmierung hin.

*** Nobody ***


19.

Hallo Nobody, wie, das sind nicht die Fehlermeldungen die ich bekomme ?

Code:                   In Zwischenablage kopieren (nur IE)
13">




20.

Nein, sind es auch nicht. Wie man jetzt sieht, gibt es nämlich eine Angabe zu der Zeile, die du vorher einfach weggelassen hast.

Zeile 120: Du vergleichst $index2 mit einer Variablen, die nie vorher einen Wert bekommen hast. Das Resultat ist daher sehr zweifelhaft.

Zeile 127: Du addierst zu $sum $index2, alledings wurde $sum vorher nicht initialisiert. Die ausgeschriebene Form wäre ja $sum = $sum + $index2;

Zeile 128: Gleiche Problem wie in Zeile 127, $i = $i +1; $i wurde vorher nicht initialisiert.

*** Nobody ***


21.

Code:                   In Zwischenablage kopieren (nur IE)
14">

Brauchte den höchstWert von index2;

Code:                   In Zwischenablage kopieren (nur IE)
15">

Hier wollte ich den Mittelwert errechnen, also alle Zahlen die $index2 enthält, durch die Anzahl der gefundenen DS


22.

Um den Mittelwert zu bestimmen, muss man aber nicht so ein Trara machen, wozu gibt es AVG, siehe http://dev.mysql.com/doc/mysql/en/group-by-functions.html

*** Nobody ***


23.

Hy, also ich habe nun immer noch keine Idee wie ich die besten 10% von meinen DS bekomme:

Code:                   In Zwischenablage kopieren (nur IE)
16">

Als was muss ich $i deklarieren und wo liegt hier der Fehler,
ich habe jetzt hier 2 Beispiel 2DS als $index Wert 5070
(also 50 und 70). Wenn ich davon den besten nehme 70
dann mueßte oben bei der Berechnung 70 rauskommen,
bei mir kommt 120 raus !


24.

@ Steiner
Irgendwie nervt es mich langsam, beinahe jeden deiner Threads auch auf phpresource.de zu finden.
Lies dir folgendes mal dazu durch. Ich hoffe du verstehst endlich warum Crosspostings nicht geduldet werden:

Zitat aus den Forenregeln:
Zitat:
Crosspostings

Technisch gesehen sind in der verwendeten Software keine Crosspostings im wörtlichen Sinne möglich. Siehe Multiposts.

Multiposts


Hier sind zwei verschiedene Fälle zu unterscheiden. Multiposts innerhalb der Seite werden nicht toleriert. Hier wird jeder Beitrag bis auf den, in den das Posting thematisch am ehesten passt gelöscht.

Multiposts mit anderen Webforen als phpforum.de werden anders behandelt. Diese Threads werden mit einem Hinweis versehen und bei mehrmaligem Crossposten werden die Threads geschlossen.
Falls du dich fragst, ob das reine Schikane von uns ist, nein, hier der Grund:

Zitat:
Crossposting bedeutet, dass ein und dieselbe Frage in mehreren Foren oder Newsgroups gleichzeitig gestellt wird. Ein solches Verhalten wird von den meisten Helfern nicht toleriert, denn damit stellst Du einerseits die Kompetenz der Helfer jedes einzelnen Forums und Newsgroup in Frage und bewirkst zudem, dass ein zig-faches an Stunden aufgewendet wird, um nur ein einziges Problem zu lösen, denn überall werden sich die Helfer daran setzen, eine Lösung für Dich zu finden. Das ist ganz klar ein Missbrauch an dem kostenlosen und freiwilligen Support, der hier angeboten wird.
Wenn Deine Frage klar und deutlich gestellt wurde, dann wirst Du ganz bestimmt innerhalb kürzester Zeit eine Antwort erhalten. Sollte dies auch nach mehreren Tagen nicht der Fall sein, dann versuche bitte die Frage besser zu formulieren. Falls Du dennoch in einem zweiten Forum posten solltest, erwähne bitte, dass Du die Frage schon woanders gestellt hast, und dass Du es tust, weil keine Lösung gefunden werden konnte.
Siehe auch
http://www.phpforum.de/forum/phpforum2_Aktuelles__18987_1082551933.html
sowie
http://www.phpforum.de/forum/news.php?boardid=12


25.

Code:                   In Zwischenablage kopieren (nur IE)
17">




26.

Sieht hier jemand einen Fehler ?

Code:                   In Zwischenablage kopieren (nur IE)
18">

$t10 gibt er nicht aus !! Jemand ne Idee ?


27.

Dein $query wird nie abgeschickt. Also es fehlt mysql_query.

Aber sollte da nicht eigentlich die Fehlermeldung mit supplied argument.... kommen?


28.

Ist error_reporting(E_ALL); noch drin?
Und wo wird $t10 ausgeben? So langsam nervt es, immer nur Teile des Quellcodes zu sehen und Fragen wie "Sieht hier jemand einen Fehler ?" zu lesen. Wie wäre es denn mal mit etwas Eigeninitiative?

Richtig debuggen
1. Man bemerkt, dass ein Skript nicht das tut, was es soll.
2. Man versucht, die Stelle die daran Schuld sein kann, schonmal einzugrenzen. Falls dies nicht geht, wird zunächst das komplette Skript als fehlerhaft angesehen.
3. An markanten Stellen im Skript lässt man sich wichtige Variableninhalte ausgeben und ggf. auch in bedingten Anweisungen eine kurze Ausgabe machen, um zu überprüfen, welche Bedingung ausgeführt wurde (oder auch nicht).
4. Schritt 3 wird so lange wiederholt, bis Unstimmigkeiten im Skript auffallen
5. Damit hat man das Problem (Unstimmigkeit) gefunden und kann versuchen diese zu beheben. Hierzu dienen dann die PHP-Dokumentation und andere Quellen als Ratgeber.
6. Lässt sich das konkrete Problem trotzdem nicht beheben, kann man in Foren um Rat fragen.
7. Das Programm läuft und man kann die Debug-Ausgaben wieder entfernen.

Die Ausgaben per echo kann man sich ersparen, in dem man einen Debugger benutzt, was eigentlich selbstverständlich sein sollte.

*** Nobody ***


29.

<php>
$gesamt=$erg->anz;
$anz=((integer)($gesamt*0.1));

$query=mysql_query("Select min($index) min, max($index) max, avg($index) mittelwert
from project_spec
WHERE country='$country' and icd_id='$icd_id'
and speciality_id='$speciality_id'
order by $index desc limit ".((integer)($gesamt*0.1)));

$t10avg=0;
for($i=0;$i<$anz;$i++)
{
$x=mysql_fetch_object($query);
$t10avg+=$x->mittelwert;
}
</php>

So die Variablen sind alle definiert, trotzdem kommt nicht das raus, was ich moechte.
Ich habe 10DS und will das er mir den die 10% besten DS, also hier 1DS ausgibt.
Leider berechnet er mir immer wieder den Mittelwert von allen DS.


30.

So langsam glaube ich, du willst uns hier verar..... Jedesmal sieht dein Quellcode anders aus. Ich sehe nirgends ein echo, mit dem du selber mal prüfen kannst, welche Werte die einzelnen Variablen haben. Außerdem sehe ich nirgends ein mysql_num_rows und mysql_error, um zu prüfen, ob das Problem nicht noch woanders liegt. So langsam aber sicher überlege ich, ob ich einfach nur aus diesem Thread aussteige oder den Thread besser schließe.

*** Nobody ***


31.

Wie kann ich die Berechnungen mit in die if-Schleife packen, so dass die Berechnung dann noch funktioniert ? Also ab dort wo die 3 *** sind ?

Code:                   In Zwischenablage kopieren (nur IE)
19">




32.

und jetzt überlegst du einmal was du genau brauchst und programmierst das von neuem.

1. zählen wieviele einträge gefunden werden (num_rows)
2. anzahl einträge * 0.1, am besten danach runden ergibt die anzahl der 10%
3. danach das feld bestimmen, von welchem der durchschnitt berechnet werden soll
4. eine sql-abfrage machen mit avg(feldname) und am schluss order by feldname entweder aufwärts oder abwärts und zusätzlich einen limit 0, wert aus der berechnung der anzahl 10%.

sowas ist doch nicht schwer wenn man das hirn ein bisschen einschaltet.

wenn es immer noch nicht klappt -> aufhören mit programmieren und ein anderes hobby suchen!


33.

Wieso ein Limit 0, was soll das bringen ?


Hier gehts zum Orginal Eintrag "Berechnung $i;" im Forum
 
phpforum.de | Impressum