downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

SimpleXMLIterator::current> <RegexIterator::setPregFlags
[edit] Last updated: Fri, 18 Sep 2009

view this page in

The SimpleXMLIterator class

Увод

The SimpleXMLIterator provides recursive iteration over all nodes of a SimpleXMLElement object.

Синтаксис за класове

SimpleXMLIterator
SimpleXMLIterator extends SimpleXMLElement implements RecursiveIterator , Traversable , Iterator , Countable {
/* Methods */
mixed current ( void )
object getChildren ( void )
bool hasChildren ( void )
mixed key ( void )
void next ( void )
void rewind ( void )
bool valid ( void )
}

Съдържание



SimpleXMLIterator::current> <RegexIterator::setPregFlags
[edit] Last updated: Fri, 18 Sep 2009
 
add a note add a note User Contributed Notes SimpleXMLIterator
ajnsit dot NOSPAM at gmail dot com 17-Mar-2011 04:14
Here's a simple function to convert an XML string to an array -

<?php
// PHP5.3 and above only
function parse($str) {
   
$f = function($iter) {
      foreach(
$iter as $key=>$val)
       
$arr[$key][] = ($iter->hasChildren())?
         
call_user_func (__FUNCTION__, $val)
          :
strval($val);
      return
$arr;
    };
    return
$f(new SimpleXmlIterator($str, null));
}
?>

PHP 5.2 and below do not have anonymous functions.
But you can create a helper function to achieve the same thing -

<?php
 
function parse($str) {
    return
parseHelper(new SimpleXmlIterator($str, null));
  }
  function
parseHelper($iter) {
    foreach(
$iter as $key=>$val)
     
$arr[$key][] = ($iter->hasChildren())?
       
call_user_func (__FUNCTION__, $val)
        :
strval($val);
    return
$arr;
  }
?>

Using it is straightforward enough -

<?php

$xml
= '
<movies>
  <movie>abcd</movie>
  <movie>efgh</movie>
  <movie>hijk</movie>
</movies>'
;
var_dump(parse($xml));

?>

This will output -

array
  'movie' =>
    array
      0 => string 'abcd' (length=4)
      1 => string 'efgh' (length=4)
      2 => string 'hijk' (length=4)
ratfactor at gmail dot com 19-Jul-2009 11:08
The documentation is a bit sparse for SimpleXmlIterator.  Here is an example showing the use of its methods. xml2Array and sxiToArray work together to convert an XML document to an associative array structure.

The contents of cats.xml:
======================================
<cats>
  <cat>
      <name>Jack</name>
      <age>2</age>
      <color>grey</color>
      <color>white</color>
  </cat>
  <cat>
      <name>Maxwell</name>
      <age>12</age>
      <color>orange</color>
      <color>black</color>
  </cat>
</cats>
======================================

<?php
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{
     
$a[$sxi->key()][] = strval($sxi->current());
    }
  }
  return
$a;
}

// Read cats.xml and print the results:
$catArray = xml2array('cats.xml');
print_r($catArray);
?>

Results (reformatted a bit for compactness and clarity):
======================================
Array(
  [cat] => Array(
    [0] => Array(
      [name] => Array(  [0] => Jack    )
      [age] => Array(   [0] => 2       )
      [color] => Array( [0] => grey,
                        [1] => white   )
    )
    [1] => Array(
      [name] => Array(  [0] => Maxwell )
      [age] => Array(   [0] => 12      )
      [color] => Array( [0] => orange
                        [1] => black   )
    )
  )
)
David Lanstein 17-Jan-2009 11:40
Unlike the DirectoryIterator, for one, you'll need to call $it->rewind() before using the iterator in a for() or while() loop.  Calling foreach() does rewind the iterator before iteration.

 
show source | credits | stats | sitemap | contact | advertising | mirror sites