Marko Mijailovic
Marko Mijailovic

Reputation: 431

Iterating over an XML file in PHP

I'm using Laravel to parse an XML file and store it into the DB. Now, it's probably some sort of a stupid mistake I can't put my finger on, but I would really appreciate if someone could check the code and the weird results I'm getting.

The XML has a deep and complex structure, here's a little piece from that's bugging me:

enter image description here

I'm dumping the $nizXMLsp in the end to see what's inside the array of objects:

public function upload(){

        $dom = new DomDocument();
        $nizBaza = DB::table('offers')->orderBy('id', 'DESC')->first();
        $nizXML = array();
        $objekat = new stdClass();
        $dom->load("storage/X_Lista.xml");
        $domXpath = new DomXPath($dom);
        $upit = $domXpath->query('//offer');
        foreach($upit as $of){
            $objekat->Time = $of->getAttribute('Time');
            $objekat->Date = $of->getAttribute('Date');
            $objekat->betRound = $of->getAttribute('betRound');
            $objekat->timestamp = $of->getAttribute('timestamp');
            array_push($nizXML, $objekat);
        }



        if(is_null($nizBaza) or $nizBaza->id != $nizXML[0]->betRound) {
            $kolo = new Offer();
            $kolo->id = $objekat->betRound;
            $kolo->ts = $objekat->Date . " " . $objekat->Time;
            $kolo->posix = $objekat->timestamp;
            $kolo->save();
            //
            $nizBaza = DB::table('sportovi')->get();
            $nizXMLsp = array(); $objekat_sp = new stdClass();
            foreach($dom->getElementsByTagName('sport') as $k=>$v){
                $objekat_sp->id = $v->getAttribute('id');
                $objekat_sp->name = $v->getAttribute('name');
                $objekat_sp->betRound = $v->parentNode->getAttribute('betRound');
                $nizXMLsp[$k] = $objekat_sp;
            }
        }
        elseif($nizBaza->id == $nizXML[0]->betRound){
            echo 'break1';
            exit;
        }
        else {
            echo 'break2';
            exit;
        }

        return var_dump($nizXMLsp);

    }

Now, what I see in the end is this:

enter image description here

instead of 4 objects with different sets of data, I get 4 objects with same set of data (all of the data comes from the last node). What could it be?

Upvotes: 1

Views: 96

Answers (2)

Parfait
Parfait

Reputation: 107632

Possibly a very simple adjustment. Just reset $objekat_sp inside the loop:

foreach($dom->getElementsByTagName('sport') as $k=>$v){
    $objekat_sp = "";   
    $objekat_sp->id = $v->getAttribute('id');
    $objekat_sp->name = $v->getAttribute('name');
    $objekat_sp->betRound = $v->parentNode->getAttribute('betRound');

    $nizXMLsp[$k] = $objekat_sp;    
}

Upvotes: 1

VolkerK
VolkerK

Reputation: 96159

Move

$objekat = new stdClass();

and

$objekat_sp = new stdClass();

inside their respective foreach loops.

Right now you're pushing the same object (after modifying its properties) into the array multiple times.

Upvotes: 0

Related Questions