---
title: "Skapa mappar rekursivt från array"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/190086-skapa-mappar-rekursivt-från-array"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "MickeA.com"
published: "2012-07-28T12:19:24.000Z"
updated: "2012-07-29T14:23:47.000Z"
replies: 6
views: 868
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/190086-skapa-mappar-rekursivt-från-array"
---

# Skapa mappar rekursivt från array

## #1 — MickeA.com, 2012-07-28T12:19Z

Tjena hej!

Jag har en array som ser ut såhär:

```
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
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:

```
Micke
Micke/Micke
Micke/Micke/Micke
Micke/Micke/Micke
Micke/Micke/Micke/Micke
```

Men resultatet blir lite konstigt, typ:

```
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! :)

Permalänk: https://www.webforum.nu/p/190086

## #2 — MickeA.com, 2012-07-28T13:10Z

Kom på vad jag gjorde fel, nu fungerar allt:

```php
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.

Permalänk: https://www.webforum.nu/p/2300056

## #3 — nitro2k01, 2012-07-28T13:15Z

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
function CreateFolders($Data = array(), $LocalPath = ROOTPATH){
    foreach($Data as $Key => $User){
        $Path = $LocalPath . $User['Name'] . "/";
...
```

För det tredje har dina exempeldata ett strukturfel:

```
                                    [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\].

Permalänk: https://www.webforum.nu/p/2300057

## #4 — nitro2k01, 2012-07-28T13:20Z

Jag rekommenderar min metod över str_replace-metoden. str_replace-metoden käns som en fullösning.

Permalänk: https://www.webforum.nu/p/2300058

## #5 — MickeA.com, 2012-07-29T08:07Z

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?

Permalänk: https://www.webforum.nu/p/2300068

## #6 — nitro2k01, 2012-07-29T11:05Z

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
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? :)

Permalänk: https://www.webforum.nu/p/2300070

## #7 — MickeA.com, 2012-07-29T14:23Z

Ahh nu är jag med. Tack!

:)

Permalänk: https://www.webforum.nu/p/2300072

---

Tråden på webben: https://www.webforum.nu/amne/php/190086-skapa-mappar-rekursivt-från-array
