Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 231
  • Last Modified:

Trying to make sense of $stack[count($stack)] = &$tree;

I'm trying to roll an XML file into a PHP array using Expat Parser, and I'm relatively new to PHP.  I came across the following code: http://us.php.net  /xml_set_element_handler.  (The sample code is about 1/3 the way down the page, author: "rubentrancoso at gmail dot com".)

I'm struggling with the last line of code in the following code block:

$file = "flow/flow.xml";
$depth = 0;
$tree = array();
$tree['name'] = "root";
$stack[count($stack)] = &$tree;

1) As I understand it, count returns the number of elements in the array, but there are no elements in the array, because $stack was just declared.  Right?
2) What's up with &$tree?  

(I have also attached the full sample of the code.)  
<?php
 
$file = "flow/flow.xml";
$depth = 0;
$tree = array();
$tree['name'] = "root";
$stack[count($stack)] = &$tree;
 
function startElement($parser, $name, $attrs) {
   global $depth;
   global $stack;
   global $tree;
  
   $element = array();
   $element['name'] = $name;
   foreach ($attrs as $key => $value) {
        //echo $key."=".$value;
        $element[$key]=$value;
    }
 
   $last = &$stack[count($stack)-1];
   $last[count($last)-1] = &$element;
   $stack[count($stack)] = &$element;
 
   $depth++;
}
 
function endElement($parser, $name) {
   global $depth;
   global $stack;
 
   array_pop($stack);
   $depth--;
}
 
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startElement", "endElement");
if (!($fp = fopen($file, "r"))) {
   die("could not open XML input");
}
 
while ($data = fread($fp, 4096)) {
   if (!xml_parse($xml_parser, $data, feof($fp))) {
       die(sprintf("XML error: %s at line %d",
                   xml_error_string(xml_get_error_code($xml_parser)),
                   xml_get_current_line_number($xml_parser)));
   }
}
xml_parser_free($xml_parser);
$tree = $stack[0][0];
echo "<pre>";
print_r($tree);
echo "</pre>";
?>

Open in new window

0
jdana
Asked:
jdana
  • 2
  • 2
1 Solution
 
MMDeveloperCommented:
stack[count($stack)] is the same as

$stack[] =

it simply says that the following value will be appended to the end of the array.


&$tree is a reference pointer per say. That means that whatever changes are made to the value in $stack[count($stack)] are replicated automatically to the original $tree value.


If I set this

$a = 5;
$b = &$a;

$b = 0;

now both $b and $a = zero. What happens to $b also happens to $a automatically.
0
 
jdanaAuthor Commented:
Does $b = &$a; set $b equal to $a BY REFERENCE as opposed to BY VALUE?
0
 
MMDeveloperCommented:
you are correct.
0
 
jdanaAuthor Commented:
Thanks!
0

Featured Post

VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now