---
title: "Rensa array på \"överflödiga\" / \"onödiga\" nycklar (rekursivt)"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/183124-rensa-array-på-överflödiga-onödiga-nycklar-rekursivt"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "MickeA.com"
published: "2010-04-09T19:41:03.000Z"
updated: "2010-04-10T15:38:44.000Z"
replies: 2
views: 757
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/183124-rensa-array-på-överflödiga-onödiga-nycklar-rekursivt"
---

# Rensa array på "överflödiga" / "onödiga" nycklar (rekursivt)

## #1 — MickeA.com, 2010-04-09T19:41Z

Hej!

Jag har en nästlad meny som genereras utifrån en array som ser ut såhär (nedan är bara en viss del):

```
Array
(
    [1] => Array
        (
            [id] => 1
            [parent] => 0
            [name] => Startsida
            [uri] => 125
            [basename] => index.php
            [child] => 
        )

    [23] => Array
        (
            [id] => 23
            [parent] => 0
            [name] => Händelser
            [uri] => 0
            [basename] => 
            [child] => Array
                (
                    [24] => Array
                        (
                            [id] => 24
                            [parent] => 23
                            [name] => Publika nyheter
                            [uri] => 0
                            [basename] => 
                            [child] => Array
                                (
                                    [27] => Array
                                        (
                                            [id] => 27
                                            [parent] => 24
                                            [name] => Lägg till
                                            [uri] => 100
                                            [basename] => news.public.add.php
                                            [child] => 
                                        )

                                    [28] => Array
                                        (
                                            [id] => 28
                                            [parent] => 24
                                            [name] => Översikt
                                            [uri] => 101
                                            [basename] => news.public.overview.php
                                            [child] => 
                                        )

                                )

                        )

                    [25] => Array
                        (
                            [id] => 25
                            [parent] => 23
                            [name] => Interna nyheter
                            [uri] => 0
                            [basename] => 
                            [child] => Array
                                (
                                    [29] => Array
                                        (
                                            [id] => 29
                                            [parent] => 25
                                            [name] => Lägg till
                                            [uri] => 67
                                            [basename] => news.private.add.php
                                            [child] => 
                                        )

                                    [30] => Array
                                        (
                                            [id] => 30
                                            [parent] => 25
                                            [name] => Översikt
                                            [uri] => 68
                                            [basename] => news.private.overview.php
                                            [child] => 
                                        )

                                )

                        )

                    [26] => Array
                        (
                            [id] => 26
                            [parent] => 23
                            [name] => Kalender
                            [uri] => 0
                            [basename] => 
                            [child] => Array
                                (
                                    [31] => Array
                                        (
                                            [id] => 31
                                            [parent] => 26
                                            [name] => Lägg till
                                            [uri] => 69
                                            [basename] => news.event.add.php
                                            [child] => 
                                        )

                                    [32] => Array
                                        (
                                            [id] => 32
                                            [parent] => 26
                                            [name] => Översikt
                                            [uri] => 70
                                            [basename] => news.event.overview.php
                                            [child] => 
                                        )

                                )

                        )

                )

        )
)
```

Nu är jag på jakt efter en funktion som kan loopa igenom arrayen och **ta bort** alla nycklar där "basename" är "" (tomt alltså) och där "child" **inte** är en array.

I arrayen är "uri" ett id för en viss sida i mitt system, jag har en array där alla Id'n en viss användare har access till och det jag behöver göra är att radera alla sidor i arrayen nedan som en besökare INTE har access till.
Just det har jag lyckats med, men problemet är att om menyn ser ut såhär:

```
Startsida		Händelser
			- Publika nyheter
			  - Lägg till
			  - Översikt

			- Interna nyheter
			  - Lägg till
			  - Översikt

			- Händelser
			  - Lägg till
			  - Översikt
```

Då kan jag enkelt plocka bort t.ex. "Lägg till" eller "Översikt" under "Publika nyheter". Men då skrivs ändå valet "Publika nyheter" ut, vilket inte är så snyggt, eftersom den inte längre har några knappar "under sig".
Jag behöver altlså en funktion som rensar bort tomma/överflödiga alternativ, som inte leder någonstans.

Har testat massa fram och tillbaka, men får det inte att fungera. Om någon vill/behöver se mer kod, säg till så ordnar vi det.

Tack tack!

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

## #2 — MickeA.com, 2010-04-09T20:45Z

Nästan...

För att förtydliga lite.. såhär kan samma array som ovan se ut om jag inaktiverat åtkomst till alla typer av händelser:

```
Array
(
    [1] => Array
        (
            [id] => 1
            [parent] => 0
            [name] => Startsida
            [uri] => 125
            [basename] => index.php
            [child] => 
        )
[red]
    [23] => Array
        (
            [id] => 23
            [parent] => 0
            [name] => Händelser
            [uri] => 0
            [basename] => 
            [child] => Array
                (
                    [24] => Array
                        (
                            [id] => 24
                            [parent] => 23
                            [name] => Publika nyheter
                            [uri] => 0
                            [basename] => 
                            [child] => 
                        )

                    [25] => Array
                        (
                            [id] => 25
                            [parent] => 23
                            [name] => Interna nyheter
                            [uri] => 0
                            [basename] => 
                            [child] => 
                        )

                    [26] => Array
                        (
                            [id] => 26
                            [parent] => 23
                            [name] => Kalender
                            [uri] => 0
                            [basename] => 
                            [child] => 
                        )

                )
        )
	[/red]
)
```

Kolla det rödmarkerade "stycket", i.o.m. att det saknas både en adress till en ev. sida samt att det saknas "barn" till en sådan, är hela det stycket "onödigt" och måste raderas. Den här funktionen hittade jag på Stackoverflow:

```php
function searchAndDestroy(&$a, $key, $val){
	foreach($a as $k => &$v){
		if(is_array($v)){
			$r = searchAndDestroy($v, $key, $val);
			if($r){
				unset($a[$k]);
			}

		}elseif($key == $k && $val == $v){
			return true;
		}

	}
	return false;
}
```

Den kan ta bort en hel "förälder", men endat baserat på **en** sak, t.ex. om jag skickar med *'basename', ''* in till funktionen, så tas rätt saker bort, men fel i mitt fall, eftersom jag måste ta bort allt där *basename* är '' **och** 'child' inte är en array, eller där arrayen inte innehåller några "barn".

Kan man tweaka den här funktionen för att göra det jag vill? Har försökt fram och tillbaka med får det inte att fungera. Kanske är det för att tröttheten börjar krypa på..

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

## #3 — MickeA.com, 2010-04-10T15:38Z

Nu är problemet ut världen, postade samma sak på phpPortalen och fick lite tips.
<http://www.phpportalen.net/viewtopic.php?p=677631#677631>

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

---

Tråden på webben: https://www.webforum.nu/amne/php/183124-rensa-array-på-överflödiga-onödiga-nycklar-rekursivt
