Summe aus einer JSON Abfrage bilden??
melanietv
- json
- php
Ich habe eine PHP datei erstellt wo eine json-abfrage von einem externen server gemacht wird.
ein auszug von meiner php-datei
...
$data=array('surflinkName'=>'melanie','date'=> $currentDateTime);
$option['query'] = array('timezone' => 'Europe/Berlin');
try {print_r($client->get("visitor_exchange.json/surflink/"
.$data['surflinkName']."/earnings_hourly/".$data['date'],
$option)->json());} catch (Exception $e){ echo $e->getMessage(); }
...
Das Ergebnis ist:
Array ( [1] => 2272.34 [2] => 1708.53 [3] => 1557.98 [4] => 1537.19 [5] => 1160.61 [6] => 1408.56 [7] => 1329.54 [8] => 1630.92 [9] => 1887.35 [10] => 2880.79 [11] => 1890.48 [12] => 2200.08 [13] => 1626.99 [14] => 1770.58 [15] => 1692.77 [16] => 1906.94 [17] => 1689.91 [18] => 1774.05 [19] => 1835.87 [20] => 1837.04 [21] => 433.00 [22] => 514.01 [23] => 1110.50 [24] => 488.30 )
wie kann ich eine Summe bilden aus [1]-[24]?
Danke für eure Hilfe ^^
LG Melanie
Liebe(r) melanietv,
Array ( [1] => 2272.34 [2] => 1708.53 [3] => 1557.98 [4] => 1537.19 [5] => 1160.61 [6] => 1408.56 [7] => 1329.54 [8] => 1630.92 [9] => 1887.35 [10] => 2880.79 [11] => 1890.48 [12] => 2200.08 [13] => 1626.99 [14] => 1770.58 [15] => 1692.77 [16] => 1906.94 [17] => 1689.91 [18] => 1774.05 [19] => 1835.87 [20] => 1837.04 [21] => 433.00 [22] => 514.01 [23] => 1110.50 [24] => 488.30 )
wie kann ich eine Summe bilden aus [1]-[24]?
suchst Du vielleicht array_sum()?
Liebe Grüße
Felix Riesterer
suchst Du vielleicht array_sum()?
Schätze, dass ist die richtige Antwort.
Hier wird zwar viel über schönheitsfehler geredet, aber keine einzige antwort auf mein problem...
wie würde der befehlssatz dann für mein anliege lauten?
array_sum()
Vielen Dank Felix ^^
Hallo,
Hier wird zwar viel über schönheitsfehler geredet, aber keine einzige antwort auf mein problem...
In der Regel hat man ja nicht nur ein Problem...
array_sum()
ups, doch eine Antwort auf deine Frage?
Gruß
Kalk
@@melanietv
Hier wird zwar viel über schönheitsfehler geredet
Unlesbarer Code ist kein Schönheitsfehler.
LLAP 🖖
Hallo melanietv,
moment mal - du schaffst es, Code wie in deinem Eingangsposting zusammenzubauen, aber dann kannst Du den Hinweis auf array_sum nicht umsetzen?
Hast Du Dir denn die Funktion im PHP Handbuch einmal angeschaut? Dass Du weißt, wo sich das befindet, unterstelle ich jetzt einfach mal.
Hat die Aufgabe einen weiteren Aspekt, der über "Summiere alle Einträge eines Arrays auf" hinausgeht und den Du uns noch nicht verraten hast?
Rolf
Hallo,
Dass Du weißt, wo sich das befindet, unterstelle ich jetzt einfach mal.
Davon kann man ausgehen, da Felix das verlinkt hat.
Gruß
Kalk
Hier wird zwar viel über schönheitsfehler geredet, aber keine einzige antwort auf mein problem...
Das stimmt nicht. Du hast die richtige Antwort erhalten und von mir sogar einen Hinweis, dass diese Antwort richtig ist. Aber genau so, wie Du den Code hier willentlich völlig unleserlich darbietest (niemand programmiert so, dass gezeigte ist das Ergebnis einer maschinellen und weitgehend nutzlosen Codeverdichtung) und diesen Umstand, der Hilfe unnötig erschwert, als "schönheitsfehler" bezeichnest, genau so hast Du nicht erkannt, dass diese Antwort Dein Problem löst.
Das hier ist Dein Code, wenn man ihn denn so präsentieren möchte, dass er auch tatsächlich menschenlesbar ist:
try {
print_r(
$client->get(
"visitor_exchange.json/surflink/"
. $data['surflinkName']
. "/earnings_hourly/"
.$data['date'],
$option
)->json()
);
} catch ( Exception $e ) {
echo $e->getMessage();
}
Du beschreibst die Ausgabe von:
Array (
[1] => 2272.34
…
[24] => 488.30
)
als das Ergebnis, dessen Summe Du suchst. Demnach kann
$client->get(
"visitor_exchange.json/surflink/"
. $data['surflinkName']
. "/earnings_hourly/"
.$data['date'],
$option
)->json()
nur ein Array sein.
Entweder notierst Du also, dass Du die Summe dieses Arrays bekommst …
try (
$arr = $client->get(
"visitor_exchange.json/surflink/"
. $data['surflinkName']
. "/earnings_hourly/"
.$data['date'],
$option
)->json();
} catch ( Exception $e ) {
trigger_error ( $e->getMessage(), E_USER_NOTICE );
}
echo '<pre>Summe:' . array_sum( $arr ) .PHP_EOL ;
print_r( $arr );
echo '<\pre>';
… oder Du denkst Dir was anderes aus…
Im Übrigen: Woher kommt denn die Klasse aus der $client gebaut wurde?
Irgendwie haben die Methoden falsche Namen und tun gerade nicht das, was ich erwarten würde.
Ich würde nämlich denken:
$object->json();
liefert JSON. Dein Objekt liefert mit der Methode 'json()' aber offensichtlich einen Array... und ausweislich Deines Topics ("Summe einer JSON Abfrage") stolperst Du selbst über diesen Fehler, der ebenfalls keineswegs nur ein Schönheitsfehler ist.!
Außerdem fehlt mit das 'getAs' - ich würde die Methoden
$object->getAsJSON();
bzw.
$object->getAsArray();
notieren und dafür sorgen, dass Rückgabe und Name übereinstimmen...
Wobei ein Array nicht mit [1] sondern mit [0] beginnt. Zumindest wenn man sich nicht selbst um die Indexe kümmert.
Ansonsten habe ich hier bereits auf den Sachverhalt hingewiesen den Du jetzt aufgreifst.
MFG
Ansonsten habe ich hier bereits auf den Sachverhalt hingewiesen den Du jetzt aufgreifst.
Felix war halt - übrigens nur 2 Minuten nach der Fragestellung - der erste.
Moin,
$client->get()
liefert keinen JSON sondern ein Array. Die Werte sind also direkt addressierbar für eine Summenbildung u.a. mathematische Operationen.
MFG
Hallo,
$client->get()
liefert keinen JSON sondern ein Array.
@pl antwortest du eigentlich nur direkt auf die Betreffzeile, oder möchtest du auch mal den dazugehörigen Text lesen?
Das Ergebnis ist:
Array (…)
stand schon mit in der Frage dabei.
Gruß
Kalk
Hallo melanietv,
Codeknäuel dieser Art sollte man vermeiden, bzw. ihre Herstellung einem Obfuscator überlassen. Du schreibst Code für zwei Zielpersonen:
Du programmierst (hoffentlich) nicht auf einem 12" Bildschirm mit 80x24 Zeichen und musst den Code nicht kompakt halten. Whitespace kostet Geld (Speicherplatz) und Laufzeit (Einlesezeit des Programms), aber beides im Mikro- bis Nanobereich. Sei also großzügig damit.
Durch lesbare Formatierung könntest Du Dir und uns sehr helfen. Ich mache Dir ein Beispiel.
So wie Du deinen Code gezeigt hast ist die Erstellung des $data Arrays überflüssig und macht das Erstellen der URL nur schwer lesbar. Aber ich nehme an, dass die Erstellung von $data und der get() Aufruf in deinem realen Code weiter voneinander entfernt sind. Darum behalte ich die Variable bei. Ich füge sogar noch zwei hinzu! Wenn der Code in einer Funktion steckt (tut er doch hoffentlich?!), stören die keinen, helfen aber beim Lesen und beim Debuggen.
Das Array-Sprachkonstrukts kannst Du mittlerweile durch die kompaktere und aus JS bekannte [ ... ]
Schreibweise ersetzen, und die Stringverkettung in der URL-Erzeugung durch String-Parsing. Bei Arrayzugriffen im String-Parsing muss man die Hochkomma für die Schlüssel weglassen.
$data = [
'surflinkName'=>'melanie',
'date'=> $currentDateTime
];
$option['query'] = [
'timezone' => 'Europe/Berlin'
];
try
{
$url = "visitor_exchange.json/surflink/$data[surflinkName]/earnings_hourly/$data[date]";
$result = $client->get($url, $option);
print_r($result->json());
}
catch (Exception $e)
{
echo $e->getMessage();
}
Lesbarer?
Rolf
Lesbarer?
Stringparsing macht den Code auch nicht besser lesbar. Und wenn wir schon den Code mit mehr Blanks und Newlines lesbarer machen wollen, dann geht das auch mit Stringverkettungen like this:
"visitor_exchange.json/surflink/"
.$data['surflinkName']
."/earnings_hourly/"
.$data['date']
Und was die Lösung des Problems betrifft, das kann man natürlich auch mit einer Schleife machen die über das Array iteriert.
MFG
Hallo pl,
gut, über Stringparsing kann man reden. Das ist nicht jedermenschs Geschmack. Danke für das Alternativbeispiel (<mecker> ich hätte aber noch ein Space hinter die Punkte gemacht </mecker>).
Rolf
Tach!
gut, über Stringparsing kann man reden. Das ist nicht jedermenschs Geschmack. Danke für das Alternativbeispiel
Das finde ich nicht unbedingt lesbarer. Der String wird damit sehr zerstückelt. Als weitere Alternative gibt es sprintf().
sprintf("visitor_exchange.json/surflink/%s/earnings_hourly/%s",
$data['surflinkName'],
$data['date'])
Damit ist der eigentliche String wieder in einem Stück. Nachteilig ist hier, dass man nun zuordnen muss, welches %s
zu welchem der weiteren Parameter gehört. Bei zweien mag das noch kein Problem sein, steigert sich aber mit jedem weiteren.
dedlfix.
gut, über Stringparsing kann man reden. Das ist nicht jedermenschs Geschmack. Danke für das Alternativbeispiel (<mecker> ich hätte aber noch ein Space hinter die Punkte gemacht </mecker>).
Selbstverständlich 😉 Aber es geht noch schöner, unter der Voraussetzung daß ohnehin eine Template'Engine geladen ist:
$url = $this->render(
'%proto%://%auth%/%path%?%params%', array(
'proto' => 'https',
'auth' => 'example.com',
'path' => 'index.html',
'params'=> $params
));
MFG
Hallo pl,
musstest Du das tun? Ich hatte es auf den Fingern, aber hab's mir verkniffen. Mit Gewalt.
Rolf
musstest Du das tun?
Natürlich, die Lösung per TE ist die einzig zweckmäßige und wenn es darum geht, redundanten Code zu vermeiden wird man damit gar nichts mehr zu tun haben sondern einfach nur noch eine Funktion aus der eigenen Faktory aufrufen:
$url = $this->create_url($components);
Ich hatte es auf den Fingern, aber hab's mir verkniffen. Mit Gewalt.
Warum sollte sich ein Fachmann seine Antworten in einem Fachforum verkneifen?
MFG
Tach!
Aber es geht noch schöner, unter der Voraussetzung daß ohnehin eine Template'Engine geladen ist:
$url = $this->render( '%proto%://%auth%/%path%?%params%', array( 'proto' => 'https', 'auth' => 'example.com', 'path' => 'index.html', 'params'=> $params ));
Nunja, man kann da auch noch mehr Aufwand reinstecken. Jetzt muss die Template Engine einen Parsevorgang starten. Der ist garantiert aufwendiger als ein vergleichbarer Parsevorgang in der PHP-Runtime, also in kompiliertem C.
Schön ist, dass die Platzhalternamen sprechend sind, und somit ihre Bedeutung einfacher zu erfassen ist. Im Falle von URLs braucht man das vielleicht weniger, da sollten die Bestandteile bekannt sein.
Aber ansonsten bekommt man diesen Aspekt auch mit PHP hin.
$url = "$proto://$auth/$path?$params";
Womit wir wieder am Ausgangspunkt wären.
dedlfix.
Hallo Rolf B,
Bei Arrayzugriffen im String-Parsing muss man die Hochkomma für die Schlüssel weglassen.
Ja, darüber habe ich mich auch schon oft geärgert. In dem Fall bin ich aber eher bei PL, eben weil man in anderen Fällen die Hochkommata/Anführungszeichen braucht.
$url = "surflink/$data[surflinkName]";
vs.
$url = "surflink/" . $data["surflinkName"];
Bis demnächst
Matthias
Hallo Matthias,
ich wollte es nicht zu weit treiben, aber wenn Du unbedingt den Key in Delimiter setzen willst, geht auch immer die komplexe Syntax, gerne auch noch garniert mit heredoc Strings um nicht Anführungszeichen in Anführungszeichen zu schachteln.
$url1 = "surflink/{$data["surflinkName"]}";
// oder
$url2 = "surflink/{$data['surflinkName']}";
// oder
$url3 = <<<END
surflink/{$data["surflinkName"]}
END;
// oder
$url4 = <<<END
surflink/{$data['surflinkName']}
END;
was aber alles eher zur Verwirrung beiträgt als zu lesbarem Code.
Rolf
Heredoc ist unschön. Besser ist, das Template für das URL in eine dedizierte Datei auszulagern:
$tmpl = file_get_contents( $this->TMPLDIR.$urltemplate );
$url = $this->render($url, $opts);
Wennschondennschon.
Heredoc ist unschön. Besser ist, das Template für das URL in eine dedizierte Datei auszulagern:
$tmpl = file_get_contents( $this->TMPLDIR.$urltemplate ); $url = $this->render($url, $opts);
Dann sollte man den Pfad zur Template-Datei konsequenterweise auch nicht mit String-Verkettung zusammenfügen, sondern mit einer ordentlichen Templating-Engine.
$path = $this->render(
'%directory%/%filename%', array(
'directory' => $this->TMPLDIR,
'filename' => $urltemplate
));
$tmpl = file_get_contents($path);
$url = $this->render($tmpl, $opts);
Und das Template dafür sollte konsequenterweise in eine eigene Datei ausgelagert werden.
$pathTmpl = filge_get_contents($this->TMPLDIR . $pathtemplate);
$path = $this->render($pathTmpl, ['directory' => $this->TMPLDIR, 'filename' => $urltemplate]);
$tmpl = file_get_contents($path);
$url = $this->render($tmpl, $opts);
Aber den Pfad für das Pfad-Template sollte man natürlich auch nicht mit String-Verkettung zusammenbauen, sondern mit einer vernünftigen Templating-Engine.
Besser ist, das Template für das URL in eine dedizierte Datei auszulagern:
Noch besser ist es die Template-Datei auf einen dedizierten Server auszulagern.
Wennschondennschon.
Eben.
Heredoc ist äußerst unschön. Aber wenn es unbedingt sein muss, einen Text oder ein Template in der PHP'Datei abzulegen, geht das ja auch so:
<?php
# PHP Code
?>
text/plain, text/html, Template
Und ist damit auch vom PHP'Code sauber getrennt.
MFG
Hallo melanietv,
was man auch nicht vergessen sollte, ist die kontextgerechte Behandlung der Parameter.
Was ist dein Client? Hat der eine Möglichkeit, URL-Parameter automatisch in Querystrings einzusetzen und sorgt gleichzeitig für eine korrekte Maskierung?
Andernfalls wäre dies hier erforderlich (nicht für 'melanie', aber wenn der Name beliebiger Herkunft sein kann):
$data = [
'surflinkName' => urlencode('melanie'),
'date' => urlencode($currentDateTime)
];
Rolf
Was ist dein Client? Hat der eine Möglichkeit, URL-Parameter automatisch in Querystrings einzusetzen und sorgt gleichzeitig für eine korrekte Maskierung?
Genau! Das ist die richtige Frage!
MFG
Was ist dein Client? Hat der eine Möglichkeit, URL-Parameter automatisch in Querystrings einzusetzen und sorgt gleichzeitig für eine korrekte Maskierung?
Genau! Das ist die richtige Frage!
Und siehe da, PHP hat sogar eine Elementarfunktion dafür http_build_query
MFG
Hat jemand eine Lösung? Oder ist das unmöglich mit meiner Ausgabe die ich vin der Serverabfrage bekomme?
Hallo melanietv,
wir haben sie und wir haben sie Dir genannt: verwende array_sum. Die Rückfrage, wo das Problem mit der Umsetzung ist, habe ich gerade auf deinen Beitrag von 12:34 gepostet. Du kannst sie dort oder hier beantworten.
Rolf
die ist wahrscheinlich aus dem anderen Forum wo sie mit derselben Dreistigkeit auftritt.
MFG