[PHP] Array volgorde veranderen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 14:09

Kaastosti

Vrolijkheid alom!

Topicstarter
Ik ben al een tijd bezig met een menustructuur, die goed van de grond begint te komen. Nou heeft iemand hier een 'briljant' idee over de manier waarop het menu weergegeven moet worden. Deze komt kort neer op het volgende:

Vanaf het item waar men zit geef je children, sibblings en de parent weer. Voor de rest alleen het pad. Ook zit er een stuk 'gat' tussen wat niet weergegeven wordt. Je krijgt dus een hoofdnavigatie, een gat, en dan een soort lokale navigatie.

Nou wordt er op dit moment een array gegenereerd van de te gebruiken items, welke weer op de juiste manier neergezet wordt door SMARTY. Die html klopt allemaal, daar blijf ik nu met m'n fikken van af (blij dat het eindelijk werkt). Wat ik wil bereiken is dat ik de array die wordt meegegeven herstructureer, zodat het precies wordt wat de bedoeling is.

Voorbeeld:

0 a
1 b
2 - f
3 - - h
4 - - i
5 - - - j
6 - - - - l
7 - - - - m > uitklapmenu
8 - - - k
9 - g
10 c

Ik heb 'm duidelijk weten te maken dat ik wat wil doen met items 8, 9 en 10. Deze moeten namelijk na item 5 geplakt worden. De array zou er dus zo uit moeten zien:

0 a
1 b
2 - f
3 - - h
4 - - i
5 - - - j
6 - - - k
7 - g
8 c
9 - - - - l
10 - - - - m > uitklapmenu

Is dit uberhaupt mogelijk, of raak ik in de knoop met de inmiddels bestaande indices? Het is 'm duidelijk om welke items het gaat en ik kan 'm ook vertellen dat ze na item 5 moeten... nou moet ie 't alleen nog doen :)

Het probleem is dat ik geen bestaande array-functies kan vinden, waarbij ik een blok kan inserten. Het gaat allemaal over 'aan het begin' of 'aan het einde' van de array, terwijl ik gewoon in het midden wil frotten :P

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

Verwijderd

hmm, je vraag was wat lastig te lezen..
je wil dus k,g,c van 9,10,11 verplaatsen naar 6,7,9
Ik denk niet dat je het haalt met die voorgebakken functies.

je zult zelf m.b.v. de array-index iets moeten schrijven bijvoorbeeld:
1: verplaats l,m etc naar het einde $array[count($array) + 1] = $array[5]; unset($array[5]); etc..
2: verplaats k etc naar boven.
3: hernummer array... die functie bestaat wel in php

natuurlijk zijn er nog andere algoritmes te verzinnen..
maar begin eens te spelen met de array-indexen.
En laat een print_r van je array zien als je er niet uitkomt.

edit: die cijfers en nummers ook... ik verwissel steeds alles 8)7

[ Voor 25% gewijzigd door Verwijderd op 06-05-2003 23:07 ]


Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 14:09

Kaastosti

Vrolijkheid alom!

Topicstarter
edit: die cijfers en nummers ook... ik verwissel steeds alles
Hehe dat ken ik :)

Ik zat zelf ook al met het idee om niet direkt in te voegen, maar eerst een zooi op te schuiven, tussenliggende leeg te maken en het er daarna weer in te zetten. Dat is echter een nogan ingewikkelde actie voor een zo simpel lijkend probleem. Ik liep er tegen aan dat ik binnen een array niet zomaar items toe kan voegen, aangezien z'n indices dan totaal over hun nek gaan.

Ik hoopte eigenlijk op een functie die iets dergelijks voor elkaar kon krijgen, of een alternatieve implementatie ervan. Als ik het zo lees zal ik toch voor de 'moeilijke' weg kiezen, alhoewel dat dan meer code opleverd, meer bewerkingen en dus trager wordt. Ach... je kan niet alles hebben.

Bedankt!

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
ik snap eigenlijk helemaal niet waarom je die dingen wilt verplaatsen, het eerste structuurtje ziet er naar mijn smaak veel gestructureerder en mooier uit. maar goed, dat zal dan wel en het oplossen van je probleem dat zal ook idd niet easy zijn.

ik sla boomstructuren altijd op in geneste arrays (of geneste objecten), zo zitten boomstructuren immers in elkaar :)

[ Voor 14% gewijzigd door Genoil op 07-05-2003 02:50 ]


Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 14:09

Kaastosti

Vrolijkheid alom!

Topicstarter
Mjah ik vind zelf de eerst ook overzichtelijker, maar ook voor de tweede opzet is wel wat te zeggen. Je hebt daar immers altijd het pad met, onder eventueel een overgeslagen stuk, de lokale navigatie van de pagina waar je op dat moment bent.

Het was ook een geneste array, maar de pagina waarop het menu komt wordt uitgegenereerd door SMARTY. De array die uiteindelijk daarheen wordt gepaast is dan ook zo simpel mogelijk
---
item - level - visible
a 0 1
etc.
---
Ik ga wel gewoon fijn aan het schuiven in m'n array :)

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

Verwijderd

op zich geen slecht id hoor om zoveel mogelijk met arrays te klooien totdat je html genereerd.
Is het later tenminste gemakkelijker om de html op te schonen ;)

Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Kaastosti schreef op 07 May 2003 @ 09:01:

..
Het was ook een geneste array, maar de pagina waarop het menu komt wordt uitgegenereerd door SMARTY. De array die uiteindelijk daarheen wordt gepaast is dan ook zo simpel mogelijk
..
Ik ga wel gewoon fijn aan het schuiven in m'n array :)
Ah ik had al zo'n vermoeden :)
Kun je niet iets doen met array_splice?
array_splice -- Verwijder een gedeelte van de array en vervang dat door iets anders

array array_splice ( array input, int offset [, int length [, array replacement]])


array_splice() verwijdert de elementen die worden aangegeven door offset en length uit de input array en vervangt ze door de elementen van de replacement array, als deze wordt gegeven. De functie geeft een array terug met daarin de verwijderde elementen.

Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 14:09

Kaastosti

Vrolijkheid alom!

Topicstarter
Da's prachtig, maar ik wil ze helemaal niet vervangen :)
Ik heb ook al uitgebreid op php.net zitten scrollen op zoek naar functies die me zouden kunnen helpen. Het gaat meestal om het vervangen van bestaande items, maar ik wil nu juist die items in een aparte array hebben en verwijderen uit het origineel.

Het is inmiddels gelukt, maar het gebeurd wel op een vrij omslachtige manier:
PHP:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
function createGap($startlvl, $endlvl, $array, $id)
{
    printArray('origineel', $array);
    //Maak een gat
    $blaatarray = array();
    for($i = 0; $i<sizeof($array); $i++)
    {
        $parent = nav_parent($id);
        $itemparent = $parent[0][0];
        if($array[$i][1] < $startlvl || $array[$i][1] > $endlvl || $array[$i][0] == $itemparent)
        {
            $blaatarray[] = $array[$i];
        }
    }
    printArray('blaatarray', $blaatarray);
    
    //Maak array van op te schuiven items
    $setaside = array();
    for($i = 0; $i<sizeof($blaatarray); $i++)
    {
        if($blaatarray[$huidig][1] > $blaatarray[$i][1])
        {
            $setaside[] = $blaatarray[$i];
        }
        $huidig = $i;
    }
    
    printArray('blok', $setaside);
    
    //Haal op te schuiven items uit orignele array
    for($i = 0; $i<sizeof($blaatarray); $i++)
    {
        for($j = 0; $j<sizeof($setaside); $j++)
        {
            if($blaatarray[$i] == $setaside[$j])
            {
                $blaatarray[$i] = null;
            }
            
        }
    }
    
    //Zet pad-items in een aparte array
    $path = array();
    for($i = 0; $i<sizeof($blaatarray); $i++)
    {
        if($blaatarray[$i][0] != $itemparent)
        {
            $path[] = $blaatarray[$i];
            $blaatarray[$i] = null;
        }
        else
        {
            $i = sizeof($blaatarray);
        }
    }
    printArray('path', $path);
    
    $blaatarray = clearArray($blaatarray);
    
    //Plak alles weer achter elkaar
    $nav = array();
    for($i = 0; $i<sizeof($path); $i++)
    {
        array_push($nav, $path[$i]);
    }
    for($i = 0; $i<sizeof($setaside); $i++)
    {
        array_push($nav, $setaside[$i]);
    }
    array_push($nav, array('<hr>',-1,1));
    for($i = 0; $i<sizeof($blaatarray); $i++)
    {
        array_push($nav, $blaatarray[$i]);
    }
    
    $blaatarray = clearArray($blaatarray);  
        
    printArray('nav', $nav);
    return $nav;
}


Zoals je ziet een hele zooi for-loops (wat ik zelf niet echt mooi vindt, maar ik kom er niet omheen), nieuwe arrays en omwegen. Het werkt wel, maar ik ben niet overtuigd van de efficientie en snelheid ervan.

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

Verwijderd

efficient.. niet zo... maar je moet wel hele rare dingen doen om performance problemen te krijgen met je arrays
Time 'm eens.. ik denk dat het best meevalt.

array_slice (NIET splice) om een stuk uit een array te halen?
array_merge bij het aanelkaar plakken?

Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 14:09

Kaastosti

Vrolijkheid alom!

Topicstarter
Mjah ik ben een beetje gaan spelen met de beschikbare array-functies en heb 't nu idd met array_splice en array_merge gedaan. Veel korter, veel duidelijker, veel efficienter. Van al die bagger for-statements ook overal foreach gemaakt :)

PHP:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
function createGap($startlvl, $endlvl, $menu, $id)
{
    //Maak een gat
    $local_menu = array();
    $parent     = nav_parent($id);
    
    foreach( $menu as $item )
    {
        if($item[1] < $startlvl || $item[1] > $endlvl || $item[0] == $parent[0][0])
        {
            $local_menu[] = $item;
        }
    }
    
    //Zoek de index van de start van het midden
    $middle_start = -1;
    $idx          =  0;
    while( $idx < count( $local_menu ) && $middle_start == -1 )
    {
        if($local_menu[$idx][0] == $parent[0][0] )
        {
            $middle_start = $idx;
        }
        $idx++;
    }
    
    //Zoek de index van start van de tail
    $tail_start = -1;
    $prev_lvl   = -1;
    while( $idx < count( $local_menu ) && $tail_start == -1 )
    {
        if($local_menu[$idx][1] < $prev_lvl )
        {
            $tail_start = $idx;
            
        }
        $prev_lvl   = $local_menu[$idx][1];
        $idx++;
    }
    
    //Geef het aantal elementen na de slice
    $times = $tail_start - $middle_start;
        
    $slice = array_splice($local_menu, $middle_start, $times);
    $nav   = array_merge ($local_menu, $slice);

    return $nav;
}


Veel mooier toch? :)

[ Voor 3% gewijzigd door Kaastosti op 07-05-2003 13:36 ]

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 14:09

Kaastosti

Vrolijkheid alom!

Topicstarter
iets te enthousiast :)

[ Voor 98% gewijzigd door Kaastosti op 07-05-2003 13:37 . Reden: Dubbelpost ]

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


Acties:
  • 0 Henk 'm!

Verwijderd

yep :) , een stuk beter te lezen,

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
is het niet makkelijk aan te pakken met multi-dimensionele arrays?

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

Pagina: 1