Array sorteren met een andere array

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Michel DS

Michel DS

24/04/2012 09:17:57
Quote Anchor link
Simpel , ik heb array $orderArray waar de info in zit en moet gesorteerd worden door $array die de volgorde bepaalt.
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);
 
PHP hulp

PHP hulp

17/05/2024 00:00:07
 
Gerhard l

gerhard l

24/04/2012 09:22:43
Quote Anchor link
Omdat het een array is?
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
$newArray = sortArrayByArray($array,$orderArray);
foreach ($newArray as $item){
    echo $item .'<br/>';
}
Gewijzigd op 24/04/2012 09:23:02 door gerhard l
 
Jacco Engel

Jacco Engel

24/04/2012 09:34:33
Quote Anchor link
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 :)
 
- Mark -

- Mark -

24/04/2012 11:05:57
Quote Anchor link
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.
 
Michel DS

Michel DS

24/04/2012 12:30:56
Quote Anchor link
Heb de teller ook op 0 gebracht, resultaat is zelfde wat niet normaal is.
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
 
Q S

Q S

24/04/2012 12:56:32
Quote Anchor link
Probeer m zo eens

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
function sortArrayByArray($array,$orderArray) {

$ordered = array();
foreach($orderArray as $key => $value) {
echo $value."<br/>";
if(array_key_exists($value,$array)) {
$ordered[$value] = $array[$value];
}
}

return $ordered;
}


?>


Toevoeging op 24/04/2012 13:04:25:

Sorry,

dit is beter

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function sortArrayByArray($array,$orderArray) {

$ordered = array();
foreach($orderArray as $key => $value) {
echo $value."<br/>";
if(array_key_exists($value,$array)) {
$ordered[] = $array[$value];
}
}

return $ordered;
}

?>
 
Michel DS

Michel DS

24/04/2012 13:11:19
Quote Anchor link
Resultaat is nu het gewenste resultaat. Nu ga ik deze 2 functies (originele) en die van jou eens goed met elkaar vergelijken om te begrijpen. Dank je zeer.

Ter info : $ordered[] of $ordered[$value] geeft hetzelfde resultaat
 
Q S

Q S

24/04/2012 13:12:41
Quote Anchor link
niet helemaal kijk maar goed
 
- SanThe -

- SanThe -

24/04/2012 13:14:36
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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>';
?>


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 -
 
- Mark -

- Mark -

24/04/2012 13:41:09
Quote Anchor link
Ik was aan ongeveer hetzelfde aan het denken. Er is echter geen foreach hiervoor nodig.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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);
    
?>
 
- SanThe -

- SanThe -

24/04/2012 13:44:37
Quote Anchor link
@Mark: Netjes. Echter heb ik in mijn testomgeving nog geen php5, dus ik heb geen array_combine(), en ik kende het ook nog niet.
 
- Mark -

- Mark -

24/04/2012 13:57:09
Quote Anchor link
@SanThe: Hoezo draai je nog zo'n oude versie als ik vragen mag? Je mist dan een heele hoop leuke nieuwe functies.

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



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.