Dinamikus Array olvasása php-ban

Címkék
Dinamikus Array olvasása php-ban
2022-09-13T15:36:15+02:00
2022-09-14T01:03:44+02:00
2022-09-14T01:41:53+02:00
stibro1977
Sziasztok,
a gondom a következő: van egy dinamikus xml, amit beolvasok rekurzivan SimpleXmlIterator-ral. nem lehet tudni, hogy milyen mély szint van, illetve nem fordul elő minden elem mindegyik xmlben (és persze idővel fejlődik az xml, előre nem tudható új tagok kerülnek majd bele)
kb így néz ki (részlet):

<stockinformations> <quoteendfiscalyear> <year yr="2020" qt="200.70" /> <year yr="2021" qt="207.65" /> <year yr="2022" qt="" /> </quoteendfiscalyear> <quoteyearhigh> <valami> <year yr="2020" qt="232.60" /> <year yr="2021" qt="223.50" /> <year yr="2022" qt="" /> </valami> </quoteyearhigh> <quoteyearlow> <year yr="1999" qt="234.80" /> <year yr="2000" qt="316.00" /> </quoteyearlow> </stockinformations>
ezt arrayba beolvasom, viszont hogyan tudnám az array-t egy táblába beolvasni, ahol az egyik oszlop az xml-tag teljes elérési útvonala, a másik az yr a harmadik meg a qt attributum.
$xmlArray['financialstatement']['assetsinsurance']['investments']
vagyis valami ilyesmi sorokat kellene a táblába írnom:
'stockinformations/quoteyearhigh/valami'  2020   232,60
'stockinformations/quoteyearhigh/valami' 2021    223,50



ezzel állítom össze az arrayt:

function xml2array($fname){ $sxi = new SimpleXmlIterator($fname, null, true); return sxiToArray($sxi); } function sxiToArray($sxi){ $a = array(); for( $sxi->rewind(); $sxi->valid(); $sxi->next() ) { if(!array_key_exists($sxi->key(), $a)){ $a[$sxi->key()] = array(); } if($sxi->hasChildren()){ $a[$sxi->key()] = sxiToArray($sxi->current()); } else{ if($sxi->current()->attributes()){ foreach ($sxi->current()->attributes() as $k => $v) { $a[$sxi->key()][$k][] = (string) $v; } } else { $a[$sxi->key()] = strval($sxi->current()); } } } return ($a); }
köszönöm a tippeket!
Mutasd a teljes hozzászólást!

  • Ha jól értem, a levélelemek érdekelnek. Ez esetleg?

    function getQuotes(DOMDocument $doc) : Generator { $leaf_nodes = (new DOMXPath($doc))->query('//*[not(*)]'); foreach ($leaf_nodes as $c) { yield [ "xpath" => $c->getNodePath(), "year" => $c->getAttribute("yr"), "quote" => $c->getAttribute("qt") ]; } }
    Kimenet a te XML-edre:

    Array ( [0] => Array ( [xpath] => /stockinformations/quoteendfiscalyear/year[1] [year] => 2020
    => 200.70     )   [1] => Array     (       [xpath] => /stockinformations/quoteendfiscalyear/year[2]       [year] => 2021      
    => 207.65     )   [2] => Array     (       [xpath] => /stockinformations/quoteendfiscalyear/year[3]       [year] => 2022      
    =>      )   [3] => Array     (       [xpath] => /stockinformations/quoteyearhigh/valami/year[1]       [year] => 2020      
    => 232.60     )   [4] => Array     (       [xpath] => /stockinformations/quoteyearhigh/valami/year[2]       [year] => 2021      
    => 223.50     )   [5] => Array     (       [xpath] => /stockinformations/quoteyearhigh/valami/year[3]       [year] => 2022      
    =>      )   [6] => Array     (       [xpath] => /stockinformations/quoteyearlow/year[1]       [year] => 1999      
    => 234.80     )   [7] => Array     (       [xpath] => /stockinformations/quoteyearlow/year[2]       [year] => 2000      
    => 316.00     ) )
    Mutasd a teljes hozzászólást!
Címkék
abcd