webForumDet fria alternativet

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

PHP

2 svar · 754 visningar · startad av MickeA.com

Medlem sedan feb. 20034 441 inlägg
Frågan#1

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!

Medlem sedan feb. 20034 441 inlägg
#2

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:

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å..

Medlem sedan feb. 20034 441 inlägg
#3

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

276 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
147 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)