function Δημοσ. 14 Δεκεμβρίου 2010 Δημοσ. 14 Δεκεμβρίου 2010 Παιδιά καλημέρα, Προσπαθώ να παρσάρω ένα xml αρχείο με την παρακάτω recursive function =================================== function displayChildrenRecursive($xmlObj,$depth=0) { foreach($xmlObj->children() as $child) { if ($child["name"]=="2010/2011") { $season_id = $child["season_id"]; return $season_id; exit; } else { displayChildrenRecursive($child,$depth+1); } } } =================================== Όταν η συνθήκη if είναι αληθής θέλω να παίρνω μία τιμή και μετά να βγαίνει τελείως από την function, κάνοντας return τη τιμή αυτή. Μέσα στο <body> λοιπόν την καλώ ως εξής: ==================================== $xml_season = simplexml_load_file("some.xml"); echo (displayChildrenRecursive($xml_season)); ==================================== ΓΙατί δεν βλέπω πουθενά να γράφεται η επιστρεφόμενη τιμή??? Ευχαριστώ!
spartakoscs Δημοσ. 14 Δεκεμβρίου 2010 Δημοσ. 14 Δεκεμβρίου 2010 δοκίμασε >$xml_season = simplexml_load_file("some.xml"); $something = displayChildrenRecursive($xml_season); echo $something;
function Δημοσ. 14 Δεκεμβρίου 2010 Μέλος Δημοσ. 14 Δεκεμβρίου 2010 Πάλι το ίδιο δυστυχώς.... Όταν την κάνω echo (αντί return) μέσα από την ίδια την function το κάνει μια χαρά. Όταν όμως την κάνω echo από έξω, δυστυχώς δεν τη βλέπω...
function Δημοσ. 14 Δεκεμβρίου 2010 Μέλος Δημοσ. 14 Δεκεμβρίου 2010 Όλο κι όλο αυτό που θέλω να κάνω είναι : 1. return μία μεταβλητή μέσα από μία function και 2. ΑΜΕΣΩΣ μετά να φύγω από την function με ένα exit ή return...
macabre_sunsets Δημοσ. 14 Δεκεμβρίου 2010 Δημοσ. 14 Δεκεμβρίου 2010 Δοκίμασε κάτι σαν το παρακάτω: >$x = ''; foreach(...) { if(συνθήκη} { $x = (τιμή που θέλεις); } if (!empty($x)) break; } return $x;
function Δημοσ. 14 Δεκεμβρίου 2010 Μέλος Δημοσ. 14 Δεκεμβρίου 2010 Είχα μία υποψία ότι μπορεί να δούλευε αυτό που έστειλες αλλά...τζίφος. Για να τεστάρετε και εσείς τον κώδικα, όλος κι όλος είναι ο παρακάτω.... --------------------------------------------- <?php define("WEBPULL_URL", "http://webpull.globalsportsmedia.com/soccer/"); //FIND COMPETITION_ID //============== $xml_competition = simplexml_load_file(WEBPULL_URL."get_competitions?area_id=68&authorized=yes"); foreach ($xml_competition->children() as $competition) { $competition_id = $competition["competition_id"]; } //echo $competition_id; //FIND SEASON_ID //============== $xml_season = simplexml_load_file(WEBPULL_URL."get_seasons?id=" . $competition_id . "&type=competition&coverage=yes"); //$something = displayChildrenRecursive($xml_season); //$something = returnValue(); echo ("The season is = " . displayChildrenRecursive($xml_season)); function displayChildrenRecursive($xmlObj,$depth=0) { $season_id = ''; foreach($xmlObj->children() as $child) { //echo $child->getName().": ".$subchild." <br>"; if ($child["name"]=="2010/2011") { $season_id = $child["season_id"]; return($season_id); exit(); //return 0; //return $season_id; } else { displayChildrenRecursive($child,$depth+1); } if (!empty($season_id)) break; } return $season_id; } //FIND MATCHES //============== ?> -----------------------------------------------------------
macabre_sunsets Δημοσ. 14 Δεκεμβρίου 2010 Δημοσ. 14 Δεκεμβρίου 2010 Έστω ότι μπει στην function μια φορά και δεν βρει αυτό που θέλεις, αυτό σημαίνει ότι θα ξαναμπει στην function, σωστά; >if ($child["name"]=="2010/2011") { [...] } else { displayChildrenRecursive($child,$depth+1); } Εστω ότι την δεύτερη φορά που μπήκε βρήκε αυτό που θέλεις, πού θα το κάνει return; Θα το κάνει στην πρώτη φορά. Εσύ όμως στην πρώτη φορά δεν ελέγχεις αν έχει επιστραφεί κάτι. >else { displayChildrenRecursive($child,$depth+1); } Άρα και να σου επιστρέψει κάτι εσύ δεν το «πιάνεις». Δεν ξέρω αν καταλαβαίνεις αυτά που έγραψα καθώς είναι λίγο «κάπως».
function Δημοσ. 14 Δεκεμβρίου 2010 Μέλος Δημοσ. 14 Δεκεμβρίου 2010 Όντως είναι λίγο κάπως... Επομένως πως πρέπει να διαμορφωθεί ο κώδιξ???
macabre_sunsets Δημοσ. 14 Δεκεμβρίου 2010 Δημοσ. 14 Δεκεμβρίου 2010 Αν μπορείς κάνε ένα paste το xml που χρησιμοποιείς ή ένα κομμάτι αυτού.
function Δημοσ. 14 Δεκεμβρίου 2010 Μέλος Δημοσ. 14 Δεκεμβρίου 2010 <?xml version="1.0" ?> <a> <method method_id="4" name="get_seasons"> <parameter name="authorized" value="no" /> <parameter name="coverage" value="yes" /> <parameter name="id" value="8" /> <parameter name="lang" value="en" /> <parameter name="type" value="competition" /> </method> <competition competition_id="8" name="aaaaaaaaaa"> <season season_id="2694" name="3456" /> <season season_id="5100" name="2010/2011" > <coverage type="1" code="Before the match" interval="30" /> <coverage type="2" code="Before the match" interval="30" /> </season> </competition> </a>
macabre_sunsets Δημοσ. 14 Δεκεμβρίου 2010 Δημοσ. 14 Δεκεμβρίου 2010 Δοκίμασε το ακόλουθο: ><?php function xml2ary(&$string) { $parser = xml_parser_create(); xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); xml_parse_into_struct($parser, $string, $vals, $index); xml_parser_free($parser); $mnary = array(); $ary = &$mnary; foreach ($vals as $r) { $t = $r['tag']; if ($r['type'] == 'open') { if (isset($ary[$t])) { if (isset($ary[$t][0])) { $ary[$t][] = array(); } else { $ary[$t] = array($ary[$t], array()); } $cv = &$ary[$t][count($ary[$t]) - 1]; } else { $cv = &$ary[$t]; } if (isset($r['attributes'])) { foreach ($r['attributes'] as $k => $v) { $cv['_a'][$k] = $v; } } $cv['_c'] = array(); $cv['_c']['_p'] = &$ary; $ary = &$cv['_c']; } elseif ($r['type'] == 'complete') { if (isset($ary[$t])) { if (isset($ary[$t][0])) { $ary[$t][] = array(); } else { $ary[$t] = array($ary[$t], array()); } $cv = &$ary[$t][count($ary[$t]) - 1]; } else { $cv= &$ary[$t]; } if (isset($r['attributes'])) { foreach ($r['attributes'] as $k => $v) { $cv['_a'][$k] = $v; } } $cv['_v'] = (isset($r['value']) ? $r['value'] : ''); } elseif ($r['type'] == 'close') { $ary = &$ary['_p']; } } _del_p($mnary); return $mnary; } function _del_p(&$ary) { foreach ($ary as $k => $v) { if ($k === '_p') { unset($ary[$k]); } elseif (is_array($ary[$k])) { _del_p($ary[$k]); } } } function findID($xml, $date) { $id = ''; foreach($xml['a']['_c']['competition']['_c']['season'] as $season) { if ($season['_a']['name'] == $date) { $id = $season['_a']['season_id']; } if (!empty($id)) break; } return $id; } $DATE_WANTED = '2010/2011'; $xml = xml2ary(file_get_contents('xml.xml')); echo findID($xml, $DATE_WANTED); ?> Οι πρώτες 2 functions είναι ένας parser που έχω βρει στο net. Μετά είναι η findID στην οποία δίνεις το περιεχόμενο του XML αρχείου και την ημερομηνία που ψάχνεις (πχ/ 2010/2011). Η function αυτή σου επιστρέφει το ID της season που έχει την τάδε ημ/νια. Εαν υπάρχουν πολλές season θα επιστρέψει μόνο την πρώτη που θα βρει. Δεν ξέρω αν είναι αυτό που θες.
function Δημοσ. 15 Δεκεμβρίου 2010 Μέλος Δημοσ. 15 Δεκεμβρίου 2010 Ευχαριστώ πολύ για τις γρήγορες απαντήσεις σας, αλλά λίγο η ζαλάδα λίγο η οικονομική κρίση (!!!!) μου θόλωνε το μυαλό εχθές. Τελικά ανακάλυψα ότι το παρακάτω δουλεύει μια χαρά: ==================================================== function displayChildrenRecursive($xmlObj,$attrForCheck,$attrForCheckValue,$attrForReturn,$depth=0) { global $id; foreach($xmlObj->children() as $child) { if ($child[$attrForCheck]==$attrForCheckValue) { $id = $child[$attrForReturn]; } displayChildrenRecursive($child,$attrForCheck,$attrForCheckValue,$attrForReturn,$depth+1); } } ====================================================
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.