[PHP] Variable variables i.c.m. arrays én objects

Pagina: 1
Acties:
  • 157 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • StalieN
  • Registratie: Februari 2002
  • Laatst online: 03-09-2024
Ik heb een lijst met xml-bestanden die elk productinformatie bevatten. Uit deze xml structuur moet ik een aantal waarden vissen, zoals een productId, product omschrijving, categorieId, etc. Met behulp van de domxml module rol ik de xml structuur uit in een xmltree: een combinatie van objects en arrays. In dit geval doe ik dus de volgende aanroep:
PHP:
1
$xmlTree = domxml_xmltree($file)
$file is hierbij de content van het xml bestand in deze string. De totale functie gaat alle xml-bestanden met productinformatie langs en leest de benodigde waarden (in totaal een stuk of acht) uit.

Omdat elk bestand deels een andere structuur heeft kan ik niet zeggen dat de 'productId' bij elk bestand te vinden is onder bijvoorbeeld $xmlTree->children[2]->attributes[3]->name;. In de ene tree is het mogelijk dat de $productId te vinden is in de tweede dimensie van de xmlTree, bij een ander zou het net zo goed de derde dimensie kunnen zijn, of de vierde.

Ik heb dus een functie geschreven die systematisch de structuur langsloopt opzoek naar bijvoorbeeld 'productId'. Tijdens het langslopen van de tree, houdt hij in een string bij waar hij op dat moment zit. Op het moment dat de 'productId' gevonden is, heb ik dus in een string het juiste 'pad' staan naar die productId. Het pad is nu bijvoorbeeld:
PHP:
1
$productId = "xmlTree->children[2]->attributes[3]->name";
Nu zet ik in deze string 'name' om naar 'value', en dan heb ik altijd de waarde van de productId. Tenminste... ik heb het pad. Want als ik nu de waarde wil uitlezen door variable variables te gebruiken gebeurt er niks:
PHP:
1
2
3
4
5
$productId = "xmlTree->children[2]->attributes[3]->value";

$productId = $$productId;

echo $productId;
Nu kom ik tot mijn vraag: hoe kan ik deze combinatie van objects en arrays in een string wèl uitlezen als variabele?

www.stevelock.nl


Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Kort antwoord: met eval().

Langer antwoord: ik zou het nooit zo doen. Wat je wel zou kunnen doen is bijvoorbeeld een array bijhouden met daarin de index van het volgende kind, ->children[3]->children[2] wordt dan gewoon array(3, 2). Als het een attribuut is moet je er even voor zorgen dat je de laatste waarde kan onderscheiden, maar dat lijkt me niet al te moeilijk.

Als je overigens enige vorm van controle hebt over de productie van de XML zou ik kijken of die anders gestructureerd kan worden, want hij lijkt me behoorlijk ranzig.

Rustacean


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Op het moment dat productId gevonden is, weet je toch al waar het zit? Waarom moet je dan het precieze pad weten? Hoe zit dat inderdaad met die XML?

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Skaah schreef op woensdag 22 februari 2006 @ 18:26:
Op het moment dat productId gevonden is, weet je toch al waar het zit? Waarom moet je dan het precieze pad weten? Hoe zit dat inderdaad met die XML?
Dat vraag ik me ook af eigenlijk...je kan toch (een reference naar) de betreffende data returnen? Waarom de moeite te doen om op een smerige manier data aan te wijzen, wanneer je het ook gewoon simpelweg door kunt geven?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

Skaah schreef op woensdag 22 februari 2006 @ 18:26:
Op het moment dat productId gevonden is, weet je toch al waar het zit? Waarom moet je dan het precieze pad weten? Hoe zit dat inderdaad met die XML?
ProductID zit dus op een variabele plek... ;)

Kan je niet gewoon elke array doorlopen met een foreach? Zo van
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
foreach($xmltree as $key => $val)
{
    if($key == "productid")
    {
        // Doe je ding
    }
    else
    {
        if(is_array($xmltree[$key]))
        {
            foreach($xmltree[$key] as $key => $val)
            {
                if($key == "ProductID")
                {
                    // Doe je ding
                }
                else
                {
                    // Doe iets anders
                }
            }
        }
    }
}
Of is dat wat te omslachtig? :?

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ja, dat is typisch iets wat je met een recursieve functie implementeert.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • CH4OS
  • Registratie: April 2002
  • Niet online

CH4OS

It's a kind of magic

.oisyn schreef op woensdag 22 februari 2006 @ 19:57:
Ja, dat is typisch iets wat je met een recursieve functie implementeert.
Ik ben een beginnend PHP'er to be honest (iets meer dan een jaartje bezig met PHP, gewoon voor hobby) en ik snap nu niet helemaal wat je bedoeld... O+

Acties:
  • 0 Henk 'm!

  • orf
  • Registratie: Augustus 2005
  • Laatst online: 15:31

orf

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php

function getProductId($aNode){
  foreach($aNode as $sKey =>$mValue){
    if (is_array($mValue){
      getProductId($mValue);
    }
    if ($sKey == 'productid'){
      return $mValue;
    }
  }
}
?>


snel probeerseltje :)

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

GJ-tje schreef op woensdag 22 februari 2006 @ 21:13:
Ik ben een beginnend PHP'er to be honest (iets meer dan een jaartje bezig met PHP, gewoon voor hobby) en ik snap nu niet helemaal wat je bedoeld... O+
Is Google stuk? :o

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 20-09 00:06
Niemand wordt echt heel blij van het doorlopen van DOM trees, daarom zijn er veel technieken bedacht om dit makkelijker te maken. Kijk bijvoorbeeld eens naar XPath, of misschien is XSL iets voor jouw? Het zou zelfs kunnen dat er voor PHP ook wel iets is zoals Castor dat voor Java is: hiermee kan je je XML naar een in code handiger mee te werken object model omzetten (marshallen en unmarshallen).

Acties:
  • 0 Henk 'm!

Verwijderd

^^ gewoon via xpath de gewenste waarden eruit halen en die via php ophalen.. niet dit geklooi, nofi :P

  • StalieN
  • Registratie: Februari 2002
  • Laatst online: 03-09-2024
aha xpath is inderdaad een goede oplossing :) maargoed ik heb nu onderhand de hele functie die xpath doet zelf uitgeschreven en met de eval functie op het einde is het inderdaad helemaal goed op te lossen... bedankt voor jullie hulp in elk geval :) en de volgende keer doe ik het maar met xpath ;)

www.stevelock.nl


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Met eval werken is nooit helemaal goed. :X [google=eval is evil]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • matthijsln
  • Registratie: Augustus 2002
  • Laatst online: 20-09 00:06
Het is inderdaad ook maar één letter verschil :)

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Nu online
-NMe- schreef op donderdag 23 februari 2006 @ 13:08:
[...]
Met eval werken is nooit helemaal goed. :X [google=eval is evil]
Ik zocht google....
Oh, please. In most circumstances, yes, EVAL is evil, but when you actually
are _evaluating_language_, there's no reason to consider it evil; it's exactly
what you're doing, whatever name it have.
In het geval van de TS is er geen enkele manier waarop eval ooit tot rare dingen kan leiden daar de geevalueerde string volledig door zijn applicatie is opgebouwd. Een soortgelijke constructie vind je ook in template-systemen om een volledig dynamisch data array aan te spreken. Een 'Eval == Evil" statement vind ik daarom wat kort door de bocht. Gereedschap dat veelvuldig slecht gebruikt wordt is immers niet per definitie slecht gereedschap...

Qua het probleem van de TS ben ik het verder eens met je eerste opmerking, als je een XML-tree kunt aflopen op zoek naar het pad naar de gewenste data dan kun je net zo goed (een referentie naar) die data teruggeven.

[google=cool een goochel-tag]

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Als iets evil is wil dat zeggen dat je het meestal niet hoeft te gebruiken, niet dat het per definitie slecht is. Dus nee, het evil noemen is niet kort door de bocht. Bovendien is het stukje dat jij quote idd waar, eval is goed te gebruiken wanneer je code wilt uitvoeren. Dat wil de topicstarter hier echter niet, hij wil gewoon iets dat een pad in een boom representeert. Dat is toch echt wat anders dan 'evaluating language', zoals de persoon in kwestie meldt.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1