Array sorteren met een andere array
Heb dit stukje ergens gevonden dat aan mijn vraag zou moeten voldoen. Dit na tevergeefse pogingen die geen oplossing boden.
Dit stukje geeft helaas enkel het woord 'Array' weer !
$array = array('2', '1', '5', '4', '3');
$orderArray = array('linka', 'linkb', 'linkc', 'linkd', 'linke');
function sortArrayByArray($array,$orderArray) {
$ordered = array();
foreach($orderArray as $key => $value) {
if(array_key_exists($key,$array)) {
$ordered[$key] = $array[$key];
unset($array[$key]);
}
}
return $ordered + $array;
}
$array = array('2', '1', '5', '4', '3');
$orderArray = array('linka', 'linkb', 'linkc', 'linkd', 'linke');
echo sortArrayByArray($array,$orderArray);
Code (php)
1
2
3
4
2
3
4
$newArray = sortArrayByArray($array,$orderArray);
foreach ($newArray as $item){
echo $item .'<br/>';
}
foreach ($newArray as $item){
echo $item .'<br/>';
}
Gewijzigd op 24/04/2012 09:23:02 door gerhard l
voor het weergeven van array content (als het om te debuggen / voor jezelf is) zou ik lekker print_r gebruiken :) No offence maar anders komt TS straks terug met een multi dimentionale (damn hopelijk heb ik dat goed geschreven :P) array en een vraag met exact dezelfde stekking :)
Je hebt nu 1 t/m 5 in de array waarmee je sorteerd. Je mist nu linka omdat de sleutels vanaf 0 beginnen. Je moet dus 0 t/m 4 gebruiken in dit voorbeeld.
Resultaat blijft steeds : linka linkb linkc linkd linke
Terwijl er eerst index 2 moet zijn (linkc), dan index 1 (linkb)... Dit is het gewenste resultaat.
Dit doe ik omdat men linken in een menu zelf een volgorde mee kan geven. En voor andere doeleinden in mijn project heb ik dit ook nodig.
foreach($orderArray as $key => $value) { -> toch voor het cijfertje te kennen ?
if(array_key_exists($key,$array)) -> check indien er ook een index bestaat voor $array (dus begint vanaf 0, 1, 2...), ja toch ?
Gewijzigd op 24/04/2012 12:46:40 door Michel DS
Code (php)
Toevoeging op 24/04/2012 13:04:25:
Sorry,
dit is beter
Ter info : $ordered[] of $ordered[$value] geeft hetzelfde resultaat
niet helemaal kijk maar goed
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$array = array('2', '1', '5', '4', '3');
$orderArray = array('linka', 'linkb', 'linkc', 'linkd', 'linke');
$alles = array();
foreach($array as $key => $value)
{
$alles[$value] = $orderArray[$key];
}
ksort($alles);
echo '<pre>' . print_r($alles, true) . '</pre>';
asort($alles);
echo '<pre>' . print_r($alles, true) . '</pre>';
?>
$array = array('2', '1', '5', '4', '3');
$orderArray = array('linka', 'linkb', 'linkc', 'linkd', 'linke');
$alles = array();
foreach($array as $key => $value)
{
$alles[$value] = $orderArray[$key];
}
ksort($alles);
echo '<pre>' . print_r($alles, true) . '</pre>';
asort($alles);
echo '<pre>' . print_r($alles, true) . '</pre>';
?>
Ik heb hier beiden array()'s samengevoegd in één array().
Met ksort() sorteer je op array('2', '1', '5', '4', '3')
En met asort() op array('linka', 'linkb', 'linkc', 'linkd', 'linke')
Gewijzigd op 24/04/2012 13:15:24 door - SanThe -
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
#| Settings :: Array met de menu links.
$links = array('linka', 'linkb', 'linkc', 'linkd', 'linke');
#| Settings :: Array met daarin de volgorde van de menu links.
$order = array(1, 0, 4, 3, 2);
#| De menu links op volgorde zetten.
$ordered_links = array_combine($order, $links);
#| De links staan nu op volgorde maar de sleutels niet. Eventjes sorteren dus.
ksort($ordered_links);
?>
#| Settings :: Array met de menu links.
$links = array('linka', 'linkb', 'linkc', 'linkd', 'linke');
#| Settings :: Array met daarin de volgorde van de menu links.
$order = array(1, 0, 4, 3, 2);
#| De menu links op volgorde zetten.
$ordered_links = array_combine($order, $links);
#| De links staan nu op volgorde maar de sleutels niet. Eventjes sorteren dus.
ksort($ordered_links);
?>
@Mark: Netjes. Echter heb ik in mijn testomgeving nog geen php5, dus ik heb geen array_combine(), en ik kende het ook nog niet.
@Michel DS: Let er ook even op dat je geen quotes hoeft te gebruiken als je met getallen aan het werken bent.
en de code in het vervolg tussen de code tags zetten [.code]hier je code[./code] zonder de . Dan is het wat beter leesbaar hier op het forum.