Return Unique Values from an XML Files using PHP, simplexml_load_file and Xpath -
this question has answer here:
- distinct in xpath? 5 answers
thank assistance in advance. have search through forum , through www looking answer cannot find straight forward one.
i trying return results xml file extracts unique value of attribute.
xml example file:
<?xml version="1.0" encoding="iso-8859-1" ?> <computers> <restults> <computer id="1" group_id="a" model_group="acer" name="acer 1 gb" /> <computer id="2" group_id="a" model_group="acer" name="acer 2 gb" /> <computer id="3" group_id="b" model_group="acer" name="acer 3 gb" /> <computer id="4" group_id="c" model_group="acer" name="acer 4 gb"/> <computer id="5" group_id="c" model_group="acer" name="acer 6 gb" /> <computer id="6" group_id="d" model_group="acer" name="acer 8 gb" /> <computer id="7" group_id="d" model_group="acer" name="acer 16 gb" /> <computer id="8" group_id="d" model_group="acer" name="acer 32 gb" /> <computer id="9" group_id="e" model_group="acer" name="acer 48 gb" /> </restults> </computers>
what want php script run through xml file , present me unique "group_id" values. ie: a,b,c,d,e
nothing more.
i've looked @ various solutions, provided on website , others, haven't worked.
i did read xpath functions , distinct-values function cannot find way identify version of xpath running? know function available in xpath 2.0
using xpath 1.0 solution know of check previous nodes same value , if found exclude node.
<?php $e = new simplexmlelement(data()); foreach( $e->xpath('/computers/restults/computer[not(@group_id=preceding-sibling::computer/@group_id)]/@group_id') $n ) { echo $n, "\n"; } function data() { return <<< eox <computers> <restults> <computer id="1" group_id="a" model_group="acer" name="acer 1 gb" /> <computer id="2" group_id="a" model_group="acer" name="acer 2 gb" /> <computer id="3" group_id="b" model_group="acer" name="acer 3 gb" /> <computer id="4" group_id="c" model_group="acer" name="acer 4 gb"/> <computer id="5" group_id="c" model_group="acer" name="acer 6 gb" /> <computer id="6" group_id="d" model_group="acer" name="acer 8 gb" /> <computer id="7" group_id="d" model_group="acer" name="acer 16 gb" /> <computer id="8" group_id="d" model_group="acer" name="acer 32 gb" /> <computer id="9" group_id="e" model_group="acer" name="acer 48 gb" /> </restults> </computers> eox; }
when using xslt < 2.0 there method called muenchian grouping helpful here.
i haven't tested both approaches against large data sets. might rather time/memory consuming....
Comments
Post a Comment