XML będzie zawierał sporą ilość elementów, do których będę musiał się jakoś odwołać.
Mam do wyboru
1. Każdemu z elementów nadać unikalny identyfikator jako atrybut
2. Owy identyfikator umieścić jako dziecko danego elementu
Taki XML w uproszczeniu wyglądał by następująco:
Wariant 1:
<test> <item id="1"> <element>1</element> </item> <item id="2"> <element>1</element> </item> <item id="3"> <element>1</element> </item> . . . </test>
Wariant 2:
<test> <item> <id>1</id> <element>some data</element> </item> <item> <id>2</id> <element>some data</element> </item> <item> <id>3</id> <element>some data</element> </item> . . . </test>
Chciałem sprawdzić, która metoda będzie wydajniejsza.
Napisałem taki kawałek kodu aby to sprawdzić:
<?php function getNodeByAttr( $nodes, $attribName, $attribValue ){ foreach( $nodes as $node ){ $temp = $node -> attributes(); if($temp[$attribName]==$attribValue) return $node; } } function getNodeByChild( $nodes, $childNodeName, $childNodeValue ){ foreach( $nodes as $node ){ if( $node -> $childNodeName == $childNodeValue) return $node; } } $attr = new SimpleXMLElement( 'a.xml', null, true); $node = new SimpleXMLElement( 'n.xml', null, true); for($i=0;$i<1000;$i++){ getNodeByAttr( $attr -> item, 'id', '50' ); } for($j=0;$j<1000;$j++){ getNodeByChild( $node -> item, 'id', '50' ); } ?>
I co się okazało ( w sumie mnie to nie dziwi, bo opcja 1 uruchamia dodatkowo funkcję attributes() ) że wrzucając identyfikatory w węzły skrypt działa zdecydowanie szybciej.
I teraz dylemat, bo mimo wszystko poprawniejszym wydaje się sposób 1... Co o tym myślicie?