preg_grep gibt keinen wert zurück


Status
Dieses Thema wurde gelöst! Zur Lösung gehen…
#1
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

#3
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"
 
#6
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.
 
#8
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>';
 
#9
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
#10
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:
#11
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
#14
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.
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…