Na wat klooien kwam Miyamoto in "De Devschuur Coffee Corner - Iteratie 2" met de term Transpose. Dat bleek al heel handig, maar tot zover krijg ik het nog niet voor elkaar. Misschien is mijn situatie anders dan wat je met transpose kan doen, dus vandaar een topic.
Situatie
Voor een website heb ik een menu waarin onder enkele categorieën een submenu zit. Normaal geen probleem, maar nu moeten de sub-items weergegeven worden in drie kolommen. Dat kan prima met float: left;, maar niet als de sortering van boven naar beneden loopt in plaats van links naar rechts.
Normaal:
1 2 3
4 5 6
7 8 9
De bedoeling:
1 4 7
2 5 8
3 6 9
Menu items
Ik werk hier aan een thema voor Wordpress en daar vang ik de menu items af in een array. De volgorde moet overigens juist blijven, anders kan Wordpress er niks mee.
Ze zitten dus in dezelfde array en worden aan de hand van properties in de array gekoppeld door parent_menu_item.
Mijn insteek
De items met een bepaalde parent uit de array halen en opslaan wat de eerste key is. Dan ga ik de items anders sorteren (transposeren) en dan weer terug in de array waar het allemaal mee begonnen is. Zo verander ik niks fundamenteels, maar van slechts op wat ik moet doen, aanpassen en weer terug.
Eerste poging
Hieronder een poging van mijzelf en een opmerking van EddoH in "De Devschuur Coffee Corner - Iteratie 2" kwam er onderstaande code uit. Deze werkte prima maar ging de mist in met ongelijke rijen. Dus 3x3=9 werkt prima, maar als er op de eerste rij 4 staan en de andere 2 rijen 3 (in het geval van 10 ipv 9 items), dan gaat hij de mist in.
Transpose
Wikipedia: Transpose
http://stackoverflow.com/...ys-in-php/3423692#3423692
Transpose bracht ander licht op de zaak en zo heet blijkbaar het probleem waar ik tegenaan loop. Zeker toen ik het plaatje op Wiki bekeek, wist ik dat dit de oplossing moest zijn. Echter heb ik het idee dat ik het niet begrepen heb, want de output is niet zoals hij hoort te zijn.
Voor zover ik begrepen heb, moet ik de bestaande array opdelen in 3 kolommen zoals te vinden is bij Normaal bovenaan in dit topic. Dan de transpose functie zoals in Stackoverflow. Alleen krijg ik dan weer een driedimensionale Array terug en alles moet in één array, onder elkaar.
Hieronder de code die ik gefabriceerd heb, misschien is er iemand die mij een hint kan geven waar ik heen moet na het transposen?
Helaas krijg ik nu weer 1 t/m 9 terug in plaats van 1 4 7 2 5 8 3 6 9
Situatie
Voor een website heb ik een menu waarin onder enkele categorieën een submenu zit. Normaal geen probleem, maar nu moeten de sub-items weergegeven worden in drie kolommen. Dat kan prima met float: left;, maar niet als de sortering van boven naar beneden loopt in plaats van links naar rechts.
Normaal:
1 2 3
4 5 6
7 8 9
De bedoeling:
1 4 7
2 5 8
3 6 9
Menu items
Ik werk hier aan een thema voor Wordpress en daar vang ik de menu items af in een array. De volgorde moet overigens juist blijven, anders kan Wordpress er niks mee.
code:
1
2
3
4
5
| Array ( 0 => Array(Parent), 1 => Array(Child), 2 => Array(Child) ) |
Ze zitten dus in dezelfde array en worden aan de hand van properties in de array gekoppeld door parent_menu_item.
Mijn insteek
De items met een bepaalde parent uit de array halen en opslaan wat de eerste key is. Dan ga ik de items anders sorteren (transposeren) en dan weer terug in de array waar het allemaal mee begonnen is. Zo verander ik niks fundamenteels, maar van slechts op wat ik moet doen, aanpassen en weer terug.
Eerste poging
Hieronder een poging van mijzelf en een opmerking van EddoH in "De Devschuur Coffee Corner - Iteratie 2" kwam er onderstaande code uit. Deze werkte prima maar ging de mist in met ongelijke rijen. Dus 3x3=9 werkt prima, maar als er op de eerste rij 4 staan en de andere 2 rijen 3 (in het geval van 10 ipv 9 items), dan gaat hij de mist in.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| $i=$first; $rows = round(count($newItems)/3); foreach ($newItems AS $key => $newItem) { echo $i; $newArray[$i] = $newItem; if (round($i/$rows) == 3) { $i = $first + (($i%$rows)+1); } else { $i = $i + $rows; } } ksort($newArray); |
Transpose
Wikipedia: Transpose
http://stackoverflow.com/...ys-in-php/3423692#3423692
Transpose bracht ander licht op de zaak en zo heet blijkbaar het probleem waar ik tegenaan loop. Zeker toen ik het plaatje op Wiki bekeek, wist ik dat dit de oplossing moest zijn. Echter heb ik het idee dat ik het niet begrepen heb, want de output is niet zoals hij hoort te zijn.
Voor zover ik begrepen heb, moet ik de bestaande array opdelen in 3 kolommen zoals te vinden is bij Normaal bovenaan in dit topic. Dan de transpose functie zoals in Stackoverflow. Alleen krijg ik dan weer een driedimensionale Array terug en alles moet in één array, onder elkaar.
Hieronder de code die ik gefabriceerd heb, misschien is er iemand die mij een hint kan geven waar ik heen moet na het transposen?
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
| // Transpose functie function transpose($array) { array_unshift($array, null); return call_user_func_array('array_map', $array); } // Driedimensionale array maken foreach ($newItems AS $key => $item) { $array[$c][$key] = $item; if ($c == 3) $c=0; else $c++; } // Transpose $newArray = transpose($array); // Items weer in één array onder elkaar. foreach ($newArray AS $column) { foreach ($column AS $row) { $final[] = $row; } } foreach ($final AS $key => $value) { echo $value->title."<br />"; } |
Helaas krijg ik nu weer 1 t/m 9 terug in plaats van 1 4 7 2 5 8 3 6 9