[PHP] Case-insensitive array-multisort

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 01-09 11:48
Met natcasesort kun je een array van strings case-insensitive sorteren. Met array_multisort kun je een array (2) in een array (1) sorteren, en andere arrays (3) die ook onderdeel zijn van de hoofdarray (1 dus) op dezelfde manier gesorteerd krijgen. De bewegingen die de elementen van array (2) maakten, worden herhaald voor de elementen van de andere arrays (3).

Is er een manier om een array (2) in een array (1) te sorteren like natcasesort en de andere arrays (3) in de hoofdarray (1) dezelfde bewegingen te laten maken als de array (2) die gesort is?

Een voorbeeldje geven kán, maar is veel moeite. Ik hoop dat mijn vraagstelling duidelijk is, en ik dit voorbeeld niet hoef te geven? Thanx *D

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

pfoei, wat mij betreft geef je wel even een voorbeeld :) Steek er maar wat tijd in >:) :Y)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

gokje... bubblesort :?

Acties:
  • 0 Henk 'm!

Verwijderd

Waarom voeg je niet aan de array 1 een nieuwe array toe, array 4, die een kopie is van array 2, maar dan alle letters in dezelfde casing (dus alle uppercase of allemaal lowercase), zodat je met arry_multisort op array 4 sorteert en de rest dan werkt zoals je wilt?

/me vindt dit eigenlijk wel een leuke Quick Hack (c) :*)
'tuurljik is een nette, zelf gecodeerde sorteerroutine mooier, maar het kost wel tijd, geeft meer code om te onderhouden, en is misschien niet eens sneller.

Acties:
  • 0 Henk 'm!

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 01-09 11:48
Bubblesorten in PHP.. Hmm, een usort met een user-functie bedoel je?
edit:
Ik weet wat bubblesorten is, alleen waarom zou je dat hier doen? Manier van sorten boeit me niet, als het maar goed gaat :P


Owkeey.. het voorbeeldje.. Lemme maak it.. WHA :P

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Array
(
    [id] => Array
        (
            [0] => 1
            [1] => 2
            [2] => 2
            [3] => 3
            [4] => 3
            [5] => 4
            [6] => 5
        )
    [naam] => Array
        (
            [0] => Jansen
            [1] => janssen
            [2] => Klaassen
            [3] => Dus
            [4] => das
            [5] => En
            [6] => Viedz
        )

)

Als je de array "naam" natcasesort, krijg je zo'n array:
code:
1
2
3
4
5
6
7
8
9
10
    [naam] => Array
        (
            [0] => das
            [1] => Dus
            [2] => En
            [3] => Jansen
            [4] => janssen
            [5] => Klaassen
            [6] => Viedz
        )

Als je um "gewoon" sort (zoals array_multisort dus ook doet) krijg je:
code:
1
2
3
4
5
6
7
8
9
10
    [naam] => Array
        (
            [0] => Dus
            [1] => En
            [2] => Jansen
            [3] => Klaassen
            [4] => Viedz
            [5] => das
            [6] => janssen
        )

Wat ik dus wil, is dat de array "naam" ge-natcasesort wordt, maar dat de andere array ("id" in dit geval) OOK op die manier gesort wordt..
Eerst hoorde 1 bij "Jansen", 2 bij "janssen", en dat moet zo blijven. Dus het uiteindelijke resultaat moet zijn:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    [id] => Array
        (
            [0] => 3
            [1] => 3
            [2] => 4
            [3] => 0
            [4] => 1
            [5] => 2
            [6] => 5
        )
    [naam] => Array
        (
            [0] => das
            [1] => Dus
            [2] => En
            [3] => Jansen
            [4] => janssen
            [5] => Klaassen
            [6] => Viedz
        )

Zo'n voorbeeldje? :P

Acties:
  • 0 Henk 'm!

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 01-09 11:48
Verwijderd schreef op 13 oktober 2002 @ 14:02:
Waarom voeg je niet aan de array 1 een nieuwe array toe, array 4, die een kopie is van array 2, maar dan alle letters in dezelfde casing (dus alle uppercase of allemaal lowercase), zodat je met arry_multisort op array 4 sorteert en de rest dan werkt zoals je wilt?
Goh, da's wel slim! :P Ik gaat eens dat proberen doen :) BRB :)

Dat werkt inderdaad.. Goed zelfs :) Thanx. Maar misschien heeft iemand nog een idee om het "netter" te maken?

Acties:
  • 0 Henk 'm!

  • tomato
  • Registratie: November 1999
  • Niet online
elviver schreef op 13 oktober 2002 @ 14:14:
Dat werkt inderdaad.. Goed zelfs :) Thanx. Maar misschien heeft iemand nog een idee om het "netter" te maken?
Ik kan zo snel geen gemakkelijker manier bedenken, maar het is natuurlijk een beetje een hack ;)

Anders zul je toch zelf met compare functies aan de slag moeten denk ik. Eerst een usort voor de 3de, 4de, 5de etc array met een compare functie die case insensitive de corresponderende waarden uit de 2de array vergelijkt. Vervolgens sorteer je de 2de array nog even case insensitive en als het goed is staat alles nog gelijk.

[edit]
Of natuurlijk wat eigenlijk het meest voor de hand ligt, zelf een sorteerfunctie schrijven die naast de waarden uit de te sorteren array ook corresponderende waarden uit andere arrays verwisselt. Een sorteerfunctie schrijven is niet moeilijk, dus dit is ook best te doen.

Acties:
  • 0 Henk 'm!

Verwijderd

ja, dat noemen ze bubblesort 8)

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

DarthRaider:
ja, dat noemen ze bubblesort 8)

* drm benieuwd is
wat is jouw uitleg van een bubblesort dan? :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 01-09 11:48
Voorbeeld van bubblesort.. Men neme een niet gesorteerde lijst van (in dit voorbeeld) gehele integers (di's dus géén PHP 8)7):
[46,69,8,26,14,78,12,24]

Stap 1
Men kijke, is het eerste element groter dan het tweede element? Nee? Mooi :) Men vergelijke het tweede element met het derde element. Groter? Ja? Verwissel de plek van de twee elementen:
[46,8,69,26,14,78,12,24]
Derde/vierde:
[46,8,26,69,14,78,12,24]
Enzovoorts, tot je alle elementen gehad hebt. Einde stap 1:
[46,8,26,14,69,12,24,78]

Stap 2
Vergelijk 1 met 2. 1e groter dan 2e? Verwisselen!
[8,46,26,14,69,12,24,78]
Doe dit vergelijken tot het een-na-laatste element (laatste element staat immers al op de goeie plek: dat was het grootste getal):
[8,26,14,46,12,24,69,78]

Stap 3
Vergelijk alle elementen tot het twee-na-laatste element:
[8,14,26,12,24,46,69,78]

Laatste stap na 5 stappen al in dit geval (uitkomst):
[8,12,14,24,26,46,69,78]

Dát is een bubblesort als ik het goed heb. Dit algoritme is niet echt efficiënt ofzo.. Hoe zou je dit in PHP moeten implementeren met mijn probleem?

[ Voor 0% gewijzigd door DRvDijk op 14-10-2002 03:27 . Reden: elementjes vetmesten ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 13 oktober 2002 @ 16:58:
[...]


ja, dat noemen ze bubblesort 8)


riiight...
ken je definities, zal ik maar zeggen :P

* .oisyn is net als drm benieuwd naar je onderbouwing

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Typish gevalletje voor een usort of wanneer het om het voorbeeld gaat zoals aangedragen de key gebruiken als id zodat je met een array minder kan werken.

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

elviver >> waarom verklap je het nou :? :X :D

* drm bedoelde zelfs dat bubblesort enkel een algoritme is, en niets te maken heeft met een bepaalde "sortering" toepassen op een andere array

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

Verwijderd

drm schreef op 14 oktober 2002 @ 01:30:

[...]

* drm benieuwd is
wat is jouw uitleg van een bubblesort dan? :)
hehe, ik gok dat we andere definitie van bubblesort hebben :D, maar k zal mijn gedachte bij bubblesort uitleggen...

men nemen 2 of meerdere arrays, voorwaarde is wel dat ze overeenkomen qua lengte (inhoud dus). Nu wil je beide arrays sorteren, met een van de arrays als basis/referentie zeg maar. De 'verplaatsing' van een item in de referentie-array, voer je ook uit in alle andere arrays die wilt 'meesorteren'.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$a = array(1,3,5,2,4);
$b = array("a","c","e","b","d");

/*
een sortering met $a als basis/referentie, zou dan worden
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)
Array
(
    [0] => a
    [1] => b
    [2] => c
    [3] => d
    [4] => e
)
*/


whaa, waar haalt ie dat dan weer vandaan?
ik moest ooit eens een multidimensional array sorteren, maar andere arrays die qua opbouw gerelateerd waren aan de te sorteren array, moesten wel dezelfde verplaatsing maken. Na wat googlen (blame them :+) kwam ik een stuk code tegen wat men bubblesort noemde ;). Hierbij vergeleek men de eerste array per 2 items, en wisselde die om aan de hand van een vergelijking, en die verplaatsing werd ook bij de andere arrays uitgevoerd, net zo lang totdat er geen verplaatsing meer waren. Het was misschien niet de meeste efficiente manier, maar ik was er mee gered :)

Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
In het voorbeeld wat je geeft, geef je aan dat een naam bij een id hoort. Waarom stop je die niet gewoon samen in een object en maak je daar een comparaisation functie bij?

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker



dan heb je toch echt de verkeerde definitie geleerd (of je hebt ze verkeerd begrepen) :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

.oisyn schreef op 14 oktober 2002 @ 19:59:

[...]


dan heb je toch echt de verkeerde definitie geleerd (of je hebt ze verkeerd begrepen) :)
school mij s bij dan ;)

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Verwijderd schreef op 14 oktober 2002 @ 18:01:
whaa, waar haalt ie dat dan weer vandaan?
ik moest ooit eens een multidimensional array sorteren, maar andere arrays die qua opbouw gerelateerd waren aan de te sorteren array, moesten wel dezelfde verplaatsing maken. Na wat googlen (blame them :+) kwam ik een stuk code tegen wat men bubblesort noemde ;).
Dat zal je verkeerd opgevat hebben.
Hierbij vergeleek men de eerste array per 2 items, en wisselde die om aan de hand van een vergelijking, en die verplaatsing werd ook bij de andere arrays uitgevoerd, net zo lang totdat er geen verplaatsing meer waren. Het was misschien niet de meeste efficiente manier, maar ik was er mee gered :)

Dat schuine stuk _dat_ is het bubblesort algortime, (het grootste element bubbelt steeds omhoog), dat er allerlei andere dingen omheen gedaan (kunnen) worden zoals array's met elkaar 'gelinkt' houden heeft er verder weinig mee te maken :)

Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Glimi:
In het voorbeeld wat je geeft, geef je aan dat een naam bij een id hoort. Waarom stop je die niet gewoon samen in een object en maak je daar een comparaisation functie bij?

woei, wat een woord :D
comparison?

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
drm schreef op 15 oktober 2002 @ 08:38:
woei, wat een woord :D
comparison?
Owkay, laat ik dan maar niet zo interessant zijn en het een vergelijkingsfunctie noemen :) ( echter vindt ik nog steeds dat ik de netste oplossing hier heb staan :P )

Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Glimi schreef op 15 oktober 2002 @ 09:31:
[...]

Owkay, laat ik dan maar niet zo interessant zijn en het een vergelijkingsfunctie noemen :) ( echter vindt ik nog steeds dat ik de netste oplossing hier heb staan :P )
Gewoon usort dus met een "vergelijkingsfunctie" :)

Inderdaad de oplossing!
Pagina: 1