preg_grep gibt keinen wert zurück


Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

123user123

Grünschnabel
Hallo,

ich bin gerade dabei eine Website zu entwickeln mit welcher ich verschiedene Werte von Bilanzen usw. eines unternehmen ausgeben kann.
Dazu verwende ich die API von folgender Website:

Financial Modeling Prep - FinancialModelingPrep

Von der API bekomme ich Daten in json format (Ausschnitt davon):

{
"INTC": {
"Revenue": {
"2013-12": "52708",
"2014-12": "55870",
"2015-12": "55355",
"2016-12": "59387",
"2017-12": "62761",
"TTM": "62761"
},
"Cost of revenue": {
"2013-12": "21187",
"2014-12": "20261",
"2015-12": "20676",
"2016-12": "23196",
"2017-12": "23692",
"TTM": "23692"
},

Um es kurz zu fassen, in HTML habe ich drei inputs reingelegt mit denen der user sein Unternehmen, Wert und von welchem Jahr dieser angezeigt werden soll angeben kann.
Bis jetzt ist es mir gelungen jeweils einen Wert auszugeben, indem ich im Jahr genau "2014-12", "2015-12" usw. eingegeben habe.
Mein Ziel wäre es jedoch diese angabe zu geben, ohne müssen den genauen Monat extra raussuchen und angeben, da sich dieser von Unternehmen zu Unternehmen ändert.

Was ich bis jetzt versucht habe ist in PHP auf die Daten vom array mit preg_grep zuzugreifen und so formatieren das ich nur diesen Anteil bekomme der den Monat angibt.
Diesen dachte ich dann mit ".=" an meine Variable "$Y" anzuhängen, leider bekomme ich von preg_grep keinen wert zurück

Ausschnitt PHP:
<?php
if(isset($_GET['Ticker']))
{
$Ticker_Name = $_GET['Ticker']; //Hole unternehmenskürzel
$Value = $_GET['Value']; //Hole gewünschten Wert
$Y = $_GET['Y']; // Hole gewünscchtes Jahr
$url = file_get_contents('https://financialmodelingprep.com/api/financials/income-statement/' . $Ticker_Name); //Hole Daten von der API
$url = str_replace('<pre>','',$url); //Schneide <pre> tag aus
$json = json_decode($url, true); //wandle in array um
$Jahr = array_slice($json[$Ticker_Name][$Value],0,1); //schneide nur den ersten arrayanteil raus
$abschnitt = preg_grep('/[0-9]*/', $Jahr); //versuch mit regex gewünschten monat rauszufischen.

echo '
<div style="table;th;td">
<table align="center">
<tr>
<th align="center">Company</th>
<th align="center">Value</th>
<th align="center">Year</th>
<th align="center">In Dollar</th>
</tr>
<tr>
<td align="center">'.$Ticker_Name.'</td>
<td align="center">'.$Value.'</td>
<td align="center">'.$Y.'</td>
<td align="center">'.$json[$Ticker_Name][$Value][$Y].'</td>
</tr>
</table>
</div>
';
}
?>

Ich gebe den Code in den Anhang da ich leider nicht ganz verstanden habe wie man den hier richtig formatiert.

Vielen Dank im voraus.
 

Anhänge

123user123

Grünschnabel
Da ich diese nicht wirklich in betracht gezogen habe.

Habe diese dafür gerade eben probiert, bei:
"json_last_error()" bekomme ich "0" heraus
"json_last_error_msg()" bekomme ich "No error"
 

123user123

Grünschnabel
Tut mir leid wenn ich da ein wenig auf der langen Leitung hänge, ist aber json_encode nicht dazu da einen PHP string in ein json array zu konvertieren?
 

lordkimahri

Grünschnabel
Der Fehler ist mir auch aufgefallen, mein denkfehler. Wenn du dein jsonarray per var_dump ausgeben lässt müsstest du den genauen aufbau sehen können.
Könntest du die Ausgabe hier mal zeigen, dann könnte man besser helfen.
 

lordkimahri

Grünschnabel
ok, ich verstehe die Variable ausgabe nicht ganz. Ist dies der Zielmonat der ausgegeben werden soll?

versuch mal folgendes:

Code:
echo '<pre>';
print_r($arr);
echo '</pre>';
 

123user123

Grünschnabel
Nun bekomme ich das:

Array
(
[2013-09] => 170910
)

Hier bekomme ich die einnahmen die das unternehmen Apple im Jahr 2013, bei ende september gemacht hat.
Um diesen Wert zu bekommen, muss ich in der eingabe "2013-09" eingeben. Das Ziel ist es aber nur "2013", "2014" oder "2015" eingeben zu können.
Der Grund dafür ist das jedes Unternehmen selbst entscheidet wann ein Geschäftsjahr vollendet ist, sich dieses ende von Unternehmen zu Unternehmen ändert und der User soll nicht suchen müssen.
 

Sempervivum

Erfahrenes Mitglied
Dieser Code sucht die Kosten für ein bestimmtes Jahr heraus, ohne dass man den Monat angeben muss:
Code:
    $json = '
    {
        "INTC":{
            "Revenue":{
                "2013-12":"52708",
                "2014-12":"55870",
                "2015-12":"55355",
                "2016-12":"59387",
                "2017-12":"62761",
                "TTM":"62761"
            },
            "Cost of revenue":{
                "2013-12":"21187",
                "2014-12":"20261",
                "2015-12":"20676",
                "2016-12":"23196",
                "2017-12":"23692",
                "TTM":"23692"
            }
        }
    }';
    $arr = json_decode($json, TRUE);
    $year = '2015';
    $pattern = "/^" . $year . "/";
    foreach ($arr['INTC']['Cost of revenue'] as $key=>$cost) {
        if (preg_match($pattern, $key)) {
            $costfound = $cost;
            break;
        }
    }
    var_dump($arr);
    var_dump($costfound);
 
Zuletzt bearbeitet:

123user123

Grünschnabel
Vielen dank für die antwort.

@Sempervivum Ich habe den von dir geposteten code probiert, klarerweise auf meine Bedürfnisse geändert und es funktioniert nun.

Jetzt würde ich noch gerne fragen ob mir jemand den richtigen schubser geben könnte, den code so abzuändern, um es dem user zu ermöglichen die Daten von einem bestimmten Zeitraum, diese in einer Tabelle stecken und ausgeben.
 

Sempervivum

Erfahrenes Mitglied
Du meinst, der Benutzer soll ein Startjahr und ein Endejahr eingeben können und von diesem Zeitraum sollen die Daten dann angezeigt werden?
 

Sempervivum

Erfahrenes Mitglied
Auch das ist kein Problem, denn mit Regex lässt sich leicht das Jahr aus dem String extrahieren:
Code:
    $json = '
    { 
        "INTC":{ 
            "Revenue":{ 
                "2013-12":"52708",
                "2014-12":"55870",
                "2015-12":"55355",
                "2016-12":"59387",
                "2017-12":"62761",
                "TTM":"62761"
            },
            "Cost of revenue":{ 
                "2013-12":"21187",
                "2014-12":"20261",
                "2015-12":"20676",
                "2016-12":"23196",
                "2017-12":"23692",
                "TTM":"23692"
            }
        }
    }';
    $arr = json_decode($json, TRUE);
    $fromyear = '2014';
    $toyear = '2016';
    $pattern = "/^(\d{4})-/";
    $costs = [];
    foreach ($arr['INTC']['Cost of revenue'] as $key=>$cost) {
        $result = preg_match($pattern, $key, $matches);
        if ($result) {
            $year = $matches[1];
            if ($year >= $fromyear && $year <= $toyear)
            $costs[] = ['Jahr'=>$year, 'Kosten'=>$cost];
        }
    }
    var_dump($arr);
    var_dump($costs);
Aus dem Array $costs kannst Du dann die Tabelle aufbauen, wie Du sie brauchst.
 

123user123

Grünschnabel
Unendlichen dank dafür, nun werde ich mich der tabelle widmen und dem schreiben der Daten in eine Datenbank.

Nochmals vielen dank.
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…