Προς το περιεχόμενο

Php return value


function

Προτεινόμενες αναρτήσεις

Δημοσ.

Παιδιά καλημέρα,

Προσπαθώ να παρσάρω ένα 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));

====================================

 

ΓΙατί δεν βλέπω πουθενά να γράφεται η επιστρεφόμενη τιμή???

Ευχαριστώ!

Δημοσ.

Πάλι το ίδιο δυστυχώς....

Όταν την κάνω echo (αντί return) μέσα από την ίδια την function το κάνει μια χαρά. Όταν όμως την κάνω echo από έξω, δυστυχώς δεν τη βλέπω...

Δημοσ.

Όλο κι όλο αυτό που θέλω να κάνω είναι :

1. return μία μεταβλητή μέσα από μία function και

2. ΑΜΕΣΩΣ μετά να φύγω από την function με ένα exit ή return...

Δημοσ.

Είχα μία υποψία ότι μπορεί να δούλευε αυτό που έστειλες αλλά...τζίφος.

Για να τεστάρετε και εσείς τον κώδικα, όλος κι όλος είναι ο παρακάτω....

 

---------------------------------------------

<?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

//==============

 

 

?>

 

-----------------------------------------------------------

Δημοσ.

Έστω ότι μπει στην function μια φορά και δεν βρει αυτό που θέλεις, αυτό σημαίνει ότι θα ξαναμπει στην function, σωστά;

>if ($child["name"]=="2010/2011")
{
[...]
}
else
{
displayChildrenRecursive($child,$depth+1);
}

Εστω ότι την δεύτερη φορά που μπήκε βρήκε αυτό που θέλεις, πού θα το κάνει return; Θα το κάνει στην πρώτη φορά. Εσύ όμως στην πρώτη φορά δεν ελέγχεις αν έχει επιστραφεί κάτι.

>else
{
displayChildrenRecursive($child,$depth+1);
}

Άρα και να σου επιστρέψει κάτι εσύ δεν το «πιάνεις».

 

Δεν ξέρω αν καταλαβαίνεις αυτά που έγραψα καθώς είναι λίγο «κάπως».

Δημοσ.

<?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>

Δημοσ.

Δοκίμασε το ακόλουθο:

><?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 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);

}

}

====================================================

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...