[PHP] Sorteren op array_keys

Pagina: 1
Acties:
  • 118 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • chuxiej
  • Registratie: Februari 2001
  • Laatst online: 13-07-2020
Beste,

Ik heb een pagina met een lijst kantoren.
Nu wordt er bij het halen van de data uit de database een best complexe berekening gemaakt.
Deze berekening is iets te complex om in de MySQL query uit te voeren waardoor het dus niet mogelijk is op het antwoord hiervan direct te sorteren in de query.
Nu moet het dus mogelijk zijn om op een aantal velden te sorteren en dacht daarom via de result array ksort te gebruiken en de array key de waarde van het te sorteren veld te maken.

Het probleem nu is dat bij ksort hij vaak niet goed sorteerd als er geldwaardes worden gebruikt tussen de 0,00 en 2000,- (hij sorteerde eerst alle bedragen tot en met 999,- en ziet 1400 pas daarna.
Weet iemand een oplossing voor dit sorteer probleem?

www.dannyhiemstra.nl


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Kun je misschien een voorbeeld geven welke data je precies terugkrijgt en hoe je het resultaat graag zou willen zien? Misschien ben ik de enige maar ik begrijp weinig van je probleem.

edit: ohja, dit is serverside scripting en hoort daarom niet in WEB thuis maar in Programming

[ Voor 30% gewijzigd door Cartman! op 24-09-2007 11:49 ]


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Dat komt omdat geld in jullie implementatie een tekst is en geen getal. Hoe staat het in de database? Is het daar een varchar of een integer/float/double/decimal?

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • chuxiej
  • Registratie: Februari 2001
  • Laatst online: 13-07-2020
Sorry voor de onduidelijk uitleg.
Ik zat inderdaad ook al te denken dat het door char/integer komt en volgens mij klopt het ook.
Ik geef aan de key ook een suffix (bv: _ID) zodat ik niet te maken krijg met een bestaande key zodat die wordt overschreven (het kan best goed voorkomen dat meerdere resultaten dezelfde uitkomst van de berekening hebben).

Zo ziet ongeveer de result array eruit:

code:
1
2
3
4
5
results (
 [684.42_231] => data array(),
 [523.45_34] => data array(),
 [1324.00_523] => data array(),
)


Als ik sorteer op kantoornaam ziet de result array er bv zo uit:
code:
1
2
3
4
5
results (
 [kantoornaam_231] => data array(),
 [kantoornaam_34] => data array(),
 [kantoornaam_523] => data array(),
)


ik sorteer daarna met ksort of krsort

www.dannyhiemstra.nl


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Tja, waarom een suffix en niet een extra veldje (of andere oplossing) zodat je wel de optimale data types kan gebruiken?

{signature}


Acties:
  • 0 Henk 'm!

  • chuxiej
  • Registratie: Februari 2001
  • Laatst online: 13-07-2020
De berekening wordt gemaakt door data die de gebruiker opgeeft.
Het is dus niet mogelijk dit van te voren in de database te bewaren, een andere oplossing is de reden van mijn topic :)

Iets wat ik kan bedenken is om een loop te maken die kijkt of de key al bestaat, zo ja tel er 1 bij op bijvoorbeeld maar dit lijkt me niet echt "netjes" al vind ik de suffix ook niet netjes maar zie geen andere oplossing

www.dannyhiemstra.nl


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
En waarom niet zo'n array maken :
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Array
(
    [231] => Array
        (
            [naam] => naam
            [bedrag] => 684.42
        )

    [34] => Array
        (
            [naam] => naam
            [bedrag] => 523.45
        )

    [523] => Array
        (
            [naam] => naam
            [bedrag] => 1324.00
        )

)

Acties:
  • 0 Henk 'm!

  • André
  • Registratie: Maart 2002
  • Laatst online: 12-09 14:32

André

Analytics dude

Move naar Programming

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Met een 'gewoon' array:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Array
(
    [0] => Array
        (
            [naam] => naam
            [bedrag] => 684.42
            [kantoorID] => 42
        )

    [1] => Array
        (
            .. etc ..
        )
)


Kun je gewoon zoiets doen:

PHP:
1
2
3
4
5
6
7
function cmp($a, $b)
{
  if($a[bedrag] == $b[bedrag]) return 0;
  return ($a[bedrag] < $b[bedrag]) ? -1 : 1;
}

usort($arr, "cmp");


Hoef je niet te kutten met je keys e.d., en als je ergens anders op wilt sorteren geef je gewoon een andere compare functie mee.

[ Voor 13% gewijzigd door Grijze Vos op 24-09-2007 12:46 ]

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


Acties:
  • 0 Henk 'm!

  • zwippie
  • Registratie: Mei 2003
  • Niet online

zwippie

Electrons at work

Het probleem nu is dat bij ksort hij vaak niet goed sorteerd als er geldwaardes worden gebruikt tussen de 0,00 en 2000,- (hij sorteerde eerst alle bedragen tot en met 999,- en ziet 1400 pas daarna.
Weet iemand een oplossing voor dit sorteer probleem?
Kun je daarvoor niet een sorting type argument bij (k)sort gebruiken?
SORT_NUMERIC - compare items numerically

How much can you compute with the "ultimate laptop" with 1 kg of mass and 1 liter of volume? Answer: not more than 10^51 operations per second on not more than 10^32 bits.


Acties:
  • 0 Henk 'm!

  • chuxiej
  • Registratie: Februari 2001
  • Laatst online: 13-07-2020
[b][message=28783253,noline]Grijze Vos schreef
Heel erg bedankt, hier is het mee gelukt!

www.dannyhiemstra.nl


Acties:
  • 0 Henk 'm!

  • cappie
  • Registratie: Februari 2000
  • Laatst online: 17-05 19:09

cappie

all lowercase

chuxiej schreef op maandag 24 september 2007 @ 13:25:
[...]

Heel erg bedankt, hier is het mee gelukt!
Heb je de data nu door MySQL of door PHP laten interpreteren?

edit: hmm, PHP dus. Kan je niet gewoon in MySQL de data op een bepaalde manier laten interpreteren?

[ Voor 18% gewijzigd door cappie op 24-09-2007 13:52 ]

Aspire to inspire before we expire | profiel | systeem

Pagina: 1