[PHP] Platte structuur naar hiërarchie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste tweakers,

ik heb een klein probleempje met een stukje code.
ik krijg uit een tabel de volgende waarden
mapnaam
mapnaam/submap1
mapnaam/submap1/map1
mapnaam/map2
mapnaam/map3
anderemap
anderemap/nieuwemap/map1


Nu wil ik deze waarden zo in een array hebben of direct naar ul li combinatie.
Maar goed ik heb weer een functie die dit vanuit een array al kan dus ik dacht ik maak een array als hieronder.

code:
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
Array
(
    [mapnaam] => Array
        (
            [submap1] => Array
                (
                    [map1] => Array
                        (
                        )

                )

            [map2] => 
            [map3] => 
        )

    [anderemap] => Array
        (
            [nieuwemap] => Array
                (
                    [map1] => 
                )

        )

)


Nu is alleen de code niet naar mijn zin.. (lijkt me duidelijk)
Echter ik zit me nu al tijden dood te staren hoe ik dit netjes moet doen...maar het blijft eigenlijk niet lukken. 8)7
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function flatToArray($arPaths)
{
    //Var
    $return = array();

    foreach($arPaths as $path)
    {
        //Explode parts on /
        $exDir = explode("/",$path);
        
        //Crappy solution
        $strReturn = "$"."return";
        foreach($exDir as $i=>$dir)
        {
            $strReturn .= "['".$dir."']";
            $strTest = "if(!isset(".$strReturn.")) { ".$strReturn."= array(); }";
            eval($strTest);
        }
    }
return $return;
}


Zou iemand me een weer een zetje willen geven. :?

Acties:
  • 0 Henk 'm!

  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
wat is dat voor een raar vies gedoe met eval, weet je uberhaupt wel waar je mee bezig bent?
als je jezelf zit dood te staren dan ben je niet goed bezig, het feitelijke programmeren is slechts een onderdeel, nadenken en je programma beredeneren is veel belangrijker, op die manier vind je je fouten.

[ Voor 53% gewijzigd door Y0ur1 op 04-05-2007 00:36 ]


Acties:
  • 0 Henk 'm!

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 19-09 22:02

krvabo

MATERIALISE!

Inderdaad. Je zit in de goede richting met je explode en je foreach (zij het dat je $i helemaal niet nodig hebt en dus gewoon foreach($exDir as $dir) kunt schrijven)
Tips:
- Met $var[] = $waarde kun je makkelijk een waarde aan een array toevoegen
- Gebruik gewoon nooit eval om php te maken van een string
- Je hebt in je hele code nergens een string nodig.
- Je code werkt niet als je:
code:
1
2
3
4
path/
path/dir
dir
path/dir/local
hebt.
Je krijgt dan zoveel als:
code:
1
2
3
4
5
6
7
8
9
10
11
Array ( 
path => ()
path => (
   dir => ()
}
dir => ()
path => (
   dir => (
      local => ()
   )
)

ik denk dat het misschien slim is om referentiemateriaal te zoeken.
Je moet bijvoorbeeld bijhouden of een directory al bestaat (die zet je dus in je array)

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
wat is dat voor een raar vies gedoe met eval, weet je uberhaupt wel waar je mee bezig bent
eval was niet mijn eerste keus, maar om het concept werkend te krijgen was het even ok..
ben nu ook op zoek naar een andere oplossing...snap zelf ook dat eval niet the way to go is.
maarre bedankt voor de input

Acties:
  • 0 Henk 'm!

  • WormLord
  • Registratie: September 2003
  • Laatst online: 10:10

WormLord

Devver

In plaats van het stoeien met strings, zou je eens kunnen kijken naar references.

Acties:
  • 0 Henk 'm!

  • mithras
  • Registratie: Maart 2003
  • Niet online
Ik zou het opsplitsen in twee aparte gedeeltes: een die de url explode en een om elk element min of meer recursief toe te voegen aan een array.

Het tweede gedeelte kijkt dus of de map moet worden aangemaakt:
Heb je /foo/bar en wil je /foo/bar/test toevoegen, kijk je of foo bestaat: zo niet: /foo/bar/test aanmaken, zo ja: kijken of /foo/bar bestaat. Zo niet: bar/test toevoegen, zo ja: kijken of /foo/bar/test bestaat. Etc etc.

Acties:
  • 0 Henk 'm!

  • wackmaniac
  • Registratie: Februari 2004
  • Laatst online: 19-09 18:02
Neem de adviezen van mithras en WormLord, gooi ze in de blender en binnen 5 minuten had ik een dergelijke functie in elkaar geknutseld. :)

Read the code, write the code, be the code!


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function flatToArray($arPaths)
{
  $return = array();

  foreach($arPaths as $path)
  {
    $temproot = &$return;

    $exDir = explode("/",$path);

    foreach($exDir as $ex)
    {
      if(!isset($temproot[$ex]))
      {
        $temproot[$ex] = array();
      }
      $temproot = &$temproot[$ex];
    }

  }
  return $return;
}


Omdat ik in een goede bui ben. De handigheid zit em erin dat je bijhoudt waar in je boom (array) je op dit moment een node wilt toevoegen, dit doe ik in temproot. Elke nieuwe regel die je toevoegt begin je weer bovenaan de boom, en dan wandel je de boom door, knopen toevoegend waar nodig.

Overigens, volgende keer dat je gaat proberen met eval te werken, schakel je PC uit...

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Overigens, volgende keer dat je gaat proberen met eval te werken, schakel je PC uit...
Hahahah je hebt volkomen gelijk...zal ik doen..

Echter ik was vanochtend inderdaad al met references begonnen....toch super bedankt...ik zat vannacht een beetje muurvast.... ik had gewoon moeten gaan slapen.. ;)
Pagina: 1