xml2array; Werkt niet zoals hij moet werken

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

ToySoldier ZegIkNiet

ToySoldier ZegIkNiet

19/08/2009 14:21:00
Quote Anchor link
Hey,

Ik gebruik deze functie om een XML bestand uit te lezen.

Even dit .xml bestand gebruiken als voorbeeld:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?xml version="1.0" encoding="ISO-8859-1" ?>
<phraseset>
    <phrase id="testing">Testing</phrase>
</phraseset>



Als ik 1 zin heb kan ik hem uitlezen als $xPhraseset['phraseset']['_c']['phrase'], maar als er meerdere zijn krijg je ['phrase'][0], ['phrase'][1] etc...

Ik wil dat deze altijd op die 2e manier gedaan word, maar wat ik ook aanpas, hij doet het gewoon niet :s

Weet iemand hoe ik dit oplos?
 
PHP hulp

PHP hulp

27/11/2024 06:22:26
 
ToySoldier ZegIkNiet

ToySoldier ZegIkNiet

20/08/2009 23:56:00
Quote Anchor link
Niemand?
 
Wim E

Wim E

21/08/2009 01:03:00
Quote Anchor link
Hoi ToySoldier, zou je je vraag misschien kunnen verduidelijken? Evt wat code posten. Als je met arrays werkt gebruik je foreach. Je kunt een lege string aanmaken en deze doormiddel van een foreach of een while(als uit db komt) vullen en zo xml bestandje maken.
 
ToySoldier ZegIkNiet

ToySoldier ZegIkNiet

21/08/2009 09:34:00
Quote Anchor link
@ Wim

De code zelf staat al in de start post :)

Je hebt wat ik wil niet helemaal begrepen; Ik gebruik deze functie om een XML bestand uit te lezen en om te zetten in een array. Ik heb de functie echter ook maar ergens van het internet afgeplukt. Als een xml-setje (zoals in mijn voorbeeld 'phraseset') 1 element heeft dan staat dan kan je hem uitlezen als $xResultaat['phraseset']['_c']['phrase'], maar als hij meerdere resultaten heeft dan kan je hem uitlezen als $xResultaat['phraseset']['_c']['phrase'][0], $xResultaat['phraseset']['_c']['phrase'][1] etc...

Mijn bedoeling is dat hij hem altijd op die 2e manier zet, dus altijd bij $xResultaat['phraseset']['_c']['phrase'][0] begint, i.p.v. bij $xResultaat['phraseset']['_c']['phrase'].
 
Krop Kroppyer

Krop Kroppyer

21/08/2009 13:46:00
Quote Anchor link
Ik weet zeker dat het beter en handiger kan, maar ik heb misschien een oplossing:
op regel 89 staat $this->_del_p( $aMNArray );
die functie verwijdert alle ... hoe heten die dingen ook alweer..
als je nog zo'n functie maakt die
- checkt of $xResultaat['phraseset']['_c']['phrase'] een array is
- zo ja, gewoon laten voor wat-ie is
- zo nee, doe je zoeits: $xResultaat['phraseset']['_c']['phrase'][0] = $xResultaat['phraseset']['_c']['phrase'];

Hieronder heb ik even snel iets gemaakt dat zou kunnen werken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
function veranderArray($p_aXMLArray)
{

  foreach($p_aXMLArray as $sKey1 => $aValue1)
  {

    foreach($aValue['_c'] as $sKey2 => $value2)
    {

      if(!is_array($value2))
      {

        $p_aXMLArray[$sKey1]['_c'][$sKey2][0] = $value2;
      }
    }
  }
}

?>
 
ToySoldier ZegIkNiet

ToySoldier ZegIkNiet

21/08/2009 16:17:00
Quote Anchor link
@ Huib Donkers
Zoiets werkt vast wel (heb het nog niet geprobeerd) maar ik kom er niet uit waar het in de functie zelf moet staan, want ik heb als het even kan liever dat hij het in de functie direct goed zet (zodat het op verdere niveau's ook nog werkt)
 
ToySoldier ZegIkNiet

ToySoldier ZegIkNiet

23/08/2009 14:46:00
Quote Anchor link
*bump*
 
ToySoldier ZegIkNiet

ToySoldier ZegIkNiet

25/08/2009 14:55:00
Quote Anchor link
*bump2*
 
Krop Kroppyer

Krop Kroppyer

26/08/2009 16:50:00
Quote Anchor link
Ik heb zelf wat geprobeerd, ik begin het een beetje te begrijpen. Mijn veranderArray() functie werkt niet. Want $value2 is hoe dan ook een array

"(zodat het op verdere niveau's ook nog werkt)", ja stom daar had ik aan moeten denken...

wat de code betreft snap ik er nog steeds niet veel van...
omdat ik niet eerg veel weet van XML laat staan van de functies xml_parser_create(), xml_parser_set_option, xml_parse_into_struct en xml_parser_free.

Ik ga morgen (of een andere keer verder kijken)
ik geloof dat je ergens tussen regel 49 en 65 wat moet aan passen.
hieronder nog even de functie zoals ik hem nu test en probeer aan te passen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
<?php
function xml2array( $sString )
{

    $xParser = xml_parser_create();
    xml_parser_set_option( $xParser, XML_OPTION_CASE_FOLDING, 0 );
    xml_parse_into_struct( $xParser, $sString, $aVals, $aIndex );
    xml_parser_free( $xParser );
    
    $aMNArray = array();
    $aXMLArray = &$aMNArray;
    
    foreach ( $aVals as $aRow )
    {

        $t = $aRow['tag'];
        if ( $aRow['type'] == 'open' )
        {

            if ( isset( $aXMLArray[$t] ) )
            {

                if ( isset( $aXMLArray[$t][0] ) )
                {

                    $aXMLArray[$t][] = array();
                }

                else
                {
                    $aXMLArray[$t] = array( $aXMLArray[$t], array() );
                }

                
                $cv = &$aXMLArray[$t][count( $aXMLArray[$t] ) - 1];
            }

            else
            {
                $cv = &$aXMLArray[$t];
            }

            
            if ( isset( $aRow['attributes'] ) )
            {

                foreach ( $aRow['attributes'] as $k =>$v )
                {

                    $cv['_a'][$k] = $v;
                }
            }

            
            $cv['_c'] = array();
            $cv['_c']['_p'] = &$aXMLArray;
            $aXMLArray = &$cv['_c'];
        }

        elseif ( $aRow['type'] == 'complete' )
        {

            if ( isset( $aXMLArray[$t] ) )
            {

                if ( isset( $aXMLArray[$t][0] ) )
                {

                    $aXMLArray[$t][] = array();
                }

                else
                {
                    $aXMLArray[$t] = array( $aXMLArray[$t], array() );
                }

                
                $cv = &$aXMLArray[$t][count( $aXMLArray[$t] ) - 1];
            }

            else
            {
                $cv = &$aXMLArray[$t];
            }

            
            if ( isset( $aRow['attributes'] ) )
            {

                foreach ( $aRow['attributes'] as $k => $v )
                {

                    $cv['_a'][$k] = $v;
                }
            }

            $cv['_v'] = ( isset( $aRow['value'] ) ? $aRow['value'] : '' );
        }

        elseif ( $aRow['type'] == 'close' )
        {

            $aXMLArray = &$aXMLArray['_p'];
        }
    }

    
    return $aMNArray;
}


$sString =
'<?xml version="1.0" encoding="ISO-8859-1" ?>
<phraseset>
    <phrase id="testing">Testing</phrase>
    <phrase id="testing2">testing2</phrase>
        <phraseset2>
            <phrase2 id="test">Test</phrase2>
        </phraseset2>
</phraseset>'
;
print_r(xml2array($sString));
?>
Gewijzigd op 01/01/1970 01:00:00 door Krop Kroppyer
 
Krop Kroppyer

Krop Kroppyer

27/08/2009 16:28:00
Quote Anchor link
HAHA gevonden! :P geloof ik...

ik heb het niet uitgebreid getest, ik heb eigenlijk maar een keer getest met een voorbeeldje... maar als je op regel 64 hierboven "$cv = &$aXMLArray[$t][];" ipv "$cv = &$aXMLArray[$t];" zet dan lijkt het te doen wat je wilt.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
XML:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<phraseset>
    <phrase id="testing">Testing</phrase>
    <phrase id="testing2">testing2</phrase>
    <phrase id="testing3">testing3</phrase>
    <phrase id="testing4">testing4</phrase>
        <phraseset2>
            <phrase2 id="test">Test</phrase2>
        </phraseset2>
</phraseset>

resultaat xml2array():
Array
(
    [phraseset] => Array
        (
            [_c] => Array
                (
                    [_p] => Array
                        (
                            [phraseset] => Array
 *RECURSION*
                        )

                    [phrase] => Array
                        (
                            [0] => Array
                                (
                                    [_a] => Array
                                        (
                                            [id] => testing
                                        )

                                    [_v] => Testing
                                )

                            [1] => Array
                                (
                                    [_a] => Array
                                        (
                                            [id] => testing2
                                        )

                                    [_v] => testing2
                                )

                            [2] => Array
                                (
                                    [_a] => Array
                                        (
                                            [id] => testing3
                                        )

                                    [_v] => testing3
                                )

                            [3] => Array
                                (
                                    [_a] => Array
                                        (
                                            [id] => testing4
                                        )

                                    [_v] => testing4
                                )

                        )

                    [phraseset2] => Array
                        (
                            [_c] => Array
                                (
                                    [_p] => Array
 *RECURSION*
                                    [phrase2] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [_a] => Array
                                                        (
                                                            [id] => test
                                                        )

                                                    [_v] => Test
                                                )

                                        )

                                )

                        )

                )

        )

)


Ik geloof dat er van regels 51-58 alleen maar regel 57 over hoeft te blijven omdat isset( $aXMLArray[$t][0] ) altijd ONWAAR is.
 
ToySoldier ZegIkNiet

ToySoldier ZegIkNiet

27/08/2009 19:57:00
Quote Anchor link
@ Huib Donkers
Die is het, perfect! En dat met 2 haakjes :D
Dankje wel :D
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.