webForum webForum sponsras med lina och serverplats av Binero AB

Gå tillbaka   webForum > Utveckling > Webbutveckling > PHP

PHP Här diskuteras allt som har med scriptspråket PHP att göra.

Svar
 
Trådverktyg Visningsalternativ
Äldre 2012-07-28, 13:19   #1
MickeA.com
Medlem
 
MickeA.coms avatar
 
Registrerad: 2003-02-03
Ort: Sabang Beach, Puerto Galera, Philippines
Inlägg: 4 460
Lösningar: 73
Skapa mappar rekursivt från array

Tjena hej!

Jag har en array som ser ut såhär:
Kod:
Array
(
    [0] => Array
        (
            [Name] => Micke
            [Children] => Array
                (
                    [0] => Array
                        (
                            [Name] => Micke
                            [Children] => Array
                                (
                                    [0] => Array
                                        (
                                            [Name] => Micke
                                            [Children] => Array()
                                        )

                                    [1] => Array
                                        (
                                            [Name] => Micke
                                            [Children] => Array
							(
								[Name] => Micke
								[Children] => Array()
							)
                                        )
			)
						)
				)
		)
)
Nu ska jag skapa mappar enligt samma hierarki, men dyker på problem när någon "children" är tom. Koden:
PHP-kod:
function CreateFolders($Data = array(), $Path ROOTPATH){
    foreach(
$Data as $Key => $User){
        
$Path .= $User['Slug'] . "/";
        echo 
$Path "<br />";
        if(
sizeof($User['Children']) != 0){
            
$Path .= $User['Slug'] . "/";
            
CreateFolders($User['Children'], $Path);
        }
    }

Den ska skapa mappar nu såhär:
Kod:
Micke
Micke/Micke
Micke/Micke/Micke
Micke/Micke/Micke
Micke/Micke/Micke/Micke
Men resultatet blir lite konstigt, typ:
Kod:
Micke
Micke/Micke/Micke/Micke/Micke
Micke/Micke/Micke/Micke/Micke/Micke/Micke
Har fastnat lite och förstår inte hur jag ska få till det, förslag tages tacksamt emot!
__________________
//Micke Andersson
Hemsida | Kontakta
----------------------
"Det är svårt att vara ödmjuk när man vet att man är bäst".
MickeA.com besöker inte forumet just nu   Svara med citat
Äldre 2012-07-28, 14:10   #2
MickeA.com
Medlem
 
MickeA.coms avatar
 
Registrerad: 2003-02-03
Ort: Sabang Beach, Puerto Galera, Philippines
Inlägg: 4 460
Lösningar: 73
Kom på vad jag gjorde fel, nu fungerar allt:
PHP-kod:
function CreateFolders($Data = array(), $Path ROOTPATH){
    foreach(
$Data as $Key => $User){
        
$Path .= $User['Slug'] . "_" $User['Id'] . "/";
        @
mkdir($Path);
        echo 
$Path "<br />";
        if(
sizeof($User['Children']) != 0){
            
CreateFolders($User['Children'], $Path);
        }
        
$Path str_replace($User['Slug'] . "_" $User['Id'] . "/"""$Path);
    }

Raden $Path = str_replace($User['Slug'] . "_" . $User['Id'] . "/", "", $Path); efter if-satsen gjorde susen.
__________________
//Micke Andersson
Hemsida | Kontakta
----------------------
"Det är svårt att vara ödmjuk när man vet att man är bäst".
MickeA.com besöker inte forumet just nu   Svara med citat
Äldre 2012-07-28, 14:15   #3
nitro2k01
Forumvärd
 
nitro2k01s avatar
 
Registrerad: 2003-08-26
Inlägg: 7 469
Lösningar: 645
Först det första körs $Path .= $User['Slug'] . "/"; två gånger, en gång utanför och en gång i if-satsen. Plocka bort körningen i if-satsen.

För det andra så plussas saker på i varje iteration, när det finns mer än en förgrening. Du vill nog egentligen göra något sådant här:

PHP-kod:
function CreateFolders($Data = array(), $LocalPath ROOTPATH){
    foreach(
$Data as $Key => $User){
        
$Path $LocalPath $User['Name'] . "/";
... 
För det tredje har dina exempeldata ett strukturfel:
Kod:
                                    [1] => Array
                                        (
                                            [Name] => Micke
                                            [Children] => Array
							(
								[Name] => Micke
								[Children] => Array()
							)
                                        )
Children sak vara en array, och nästa barn ska alltså ligga under [Children] => [0] inte direkt under [Children].
__________________
Gameboy Genius - Foto: Gatukonst och elektronikporr
Internklippning:
1) Snaggning av fångar.
2) Klippning frisörer emellan.
nitro2k01 besöker inte forumet just nu   Svara med citat
Äldre 2012-07-28, 14:20   #4
nitro2k01
Forumvärd
 
nitro2k01s avatar
 
Registrerad: 2003-08-26
Inlägg: 7 469
Lösningar: 645
Jag rekommenderar min metod över str_replace-metoden. str_replace-metoden käns som en fullösning.
__________________
Gameboy Genius - Foto: Gatukonst och elektronikporr
Internklippning:
1) Snaggning av fångar.
2) Klippning frisörer emellan.
nitro2k01 besöker inte forumet just nu   Svara med citat
Äldre 2012-07-29, 09:07   #5
MickeA.com
Medlem
 
MickeA.coms avatar
 
Registrerad: 2003-02-03
Ort: Sabang Beach, Puerto Galera, Philippines
Inlägg: 4 460
Lösningar: 73
Aha, strukturfelet i arrayen var mitt fel, ersätte alla värden med "Micke" i mitt exempel och då blev det fel. Jag är inte helt med på vad du menar med att skippa "str_replace". Det fungerar ju att sätta ROOTPATH sålänge man befinner sig på "nivå 1", men om man är på t.ex. nivå 4 och sen ska fortsätta till nivå 3 blir det väl fel?
__________________
//Micke Andersson
Hemsida | Kontakta
----------------------
"Det är svårt att vara ödmjuk när man vet att man är bäst".
MickeA.com besöker inte forumet just nu   Svara med citat
Äldre 2012-07-29, 12:05 Markerad som löst av MickeA.com   #6
nitro2k01
Forumvärd
 
nitro2k01s avatar
 
Registrerad: 2003-08-26
Inlägg: 7 469
Lösningar: 645
Hmm? ROOTPATH är ju defaultvärdet och används när du inte skickar med en andra parameter. Den biten fungerar precis likadant som innan.

Notera att det enda jag har gjort med första raden är att byta namn på parametern från $Path till $LocalPath. Detta för att spara undan vilket värde som skickades till funktioen. Sedan en rad som i varje iteration av loopen skapar ett nytt värde för $Path.

Vad du gör istället för att spara undan det medskickade värdet är att först plussa på undermappen i varje iteration och sedan plocka bort undermappen från den påplussade strängen. Fult.

För att sätta mitt förslag i sitt sammanhang:
PHP-kod:
function CreateFolders($Data = array(), $LocalPath ROOTPATH){ 
    foreach(
$Data as $Key => $User){ 
        
// Det nya värdet av $Path är inte längre beroende av det gamla värdet av $Path
        
$Path $LocalPath $User['Slug'] . "_" $User['Id'] . "/"
        @
mkdir($Path); 
        echo 
$Path "<br />"
        if(
sizeof($User['Children']) != 0){ 
            
CreateFolders($User['Children'], $Path); 
        } 
    } 

Ser du nu vad jag är ute efter?
__________________
Gameboy Genius - Foto: Gatukonst och elektronikporr
Internklippning:
1) Snaggning av fångar.
2) Klippning frisörer emellan.
nitro2k01 besöker inte forumet just nu   Svara med citat
Äldre 2012-07-29, 15:23   #7
MickeA.com
Medlem
 
MickeA.coms avatar
 
Registrerad: 2003-02-03
Ort: Sabang Beach, Puerto Galera, Philippines
Inlägg: 4 460
Lösningar: 73
Ahh nu är jag med. Tack!

:)
__________________
//Micke Andersson
Hemsida | Kontakta
----------------------
"Det är svårt att vara ödmjuk när man vet att man är bäst".
MickeA.com besöker inte forumet just nu   Svara med citat
Svar
webForum > Utveckling > Webbutveckling > PHP

Trådverktyg
Visningsalternativ

Forumregler
Du får inte posta nya trådar
Du får inte posta svar
Du får inte bifoga filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är av
HTML-kod är av

Forumhopp


Alla tider är i GMT +1. Klockan är nu 06:39.


Powered by: vBulletin Version 3.8.6
Copyright © webForum