Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[PHP] Sorteren van decimals in een multidimensional array

Pagina: 1
Acties:

  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
Ik probeer middels usort een multidimensional array te sorteren op cijfers met 2 decimalen achter de komma. Ik heb de volgende code:

PHP:
1
2
3
4
5
6
7
8
9
10
11
$test = array();
$test[] = array('sport'=>'tennis','score'=>47.32);
$test[] = array('sport'=>'voetbal','score'=>46.45);
$test[] = array('sport'=>'basketbal','score'=>71.17);


usort($test, function($a, $b) {
    return $a['score'] - $b['score'];
});

echo "<h3>Test</h3><pre>",print_r($test),"</pre>";


Het gewenste resultaat is de volgorde:
  • voetbal
  • tennis
  • basketbal
Maar ik krijg steeds:
  • tennis
  • voetbal
  • basketbal
Ik kan de oplossing maar niet vinden, wie kan mij in de goede richting helpen?

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Staat gewoon in de documentatie: http://php.net/manual/en/function.usort.php

"Caution
Returning non-integer values from the comparison function, such as float, will result in an internal cast to integer of the callback's return value. So values such as 0.99 and 0.1 will both be cast to an integer value of 0, which will compare such values as equal."

"Any sufficiently advanced technology is indistinguishable from magic."


  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
Ja, ik heb dat gelezen, alleen kan ik nergens een oplossing vinden...

  • Joolee
  • Registratie: Juni 2005
  • Niet online
Je kunt eerst even door het lijstje heenlopen om alle cijfers x 1000 te doen.

  • storeman
  • Registratie: April 2004
  • Laatst online: 23:39
Wat dacht je van:

PHP:
1
2
3
usort($test, function($a, $b) {
    return $a['score'] - $b['score'] > 0 ? 1:-1;
});

"Chaos kan niet uit de hand lopen"


  • DeepFreeze.NL
  • Registratie: April 2006
  • Laatst online: 02-03 08:01
storeman schreef op vrijdag 08 februari 2013 @ 15:24:
Wat dacht je van:

PHP:
1
2
3
usort($test, function($a, $b) {
    return $a['score'] - $b['score'] > 0 ? 1:-1;
});
Dankje! Ik ben er net achtergekomen dat het volgende ook werkt:
PHP:
1
2
3
usort($test, function($a, $b) {
    return $a['score'] > $b['score'];
});

  • alex3305
  • Registratie: Januari 2004
  • Laatst online: 23:05
Ja, want in beide resultaten geef je dan een boolean terug in plaats van een kommagetal. Alleen moet je niet vergeten om eventueel gelijke getallen ook mee te nemen in je vergelijking. Dus een situatie waarbij a en b gelijk zijn aan elkaar.

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Joolee schreef op vrijdag 08 februari 2013 @ 15:23:
Je kunt eerst even door het lijstje heenlopen om alle cijfers x 1000 te doen.
x100 is ook wel genoeg en dat hoeft niet vooraf, dat kan prima in die compare-functie.

"Any sufficiently advanced technology is indistinguishable from magic."


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Herko_ter_Horst schreef op vrijdag 08 februari 2013 @ 17:12:
[...]

x100 is ook wel genoeg en dat hoeft niet vooraf, dat kan prima in die compare-functie.
Waarom zou je 't überhaupt x<iets> doen (zie de posts boven de jouwe)?

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
RobIII schreef op vrijdag 08 februari 2013 @ 18:53:
[...]

Waarom zou je 't überhaupt x<iets> doen (zie de posts boven de jouwe)?
Volgens mij juist vanwege het feit dat je met een boolean maar twee situaties mee kan nemen.

"Any sufficiently advanced technology is indistinguishable from magic."


  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Herko_ter_Horst schreef op zaterdag 09 februari 2013 @ 00:14:
[...]

Volgens mij juist vanwege het feit dat je met een boolean maar twee situaties mee kan nemen.
? er zijn toch ook maar twee situaties nodig bij een sorteer algoritme? iets is "groter dan", of iets is "niet groter dan" (gelijk valt onder "niet groter dan")....

[ Voor 40% gewijzigd door P.O. Box op 09-02-2013 15:05 ]


  • Raynman
  • Registratie: Augustus 2004
  • Laatst online: 00:46
Hoe moeilijk is het nou om gewoon even die manual-pagina (link uit eerste reactie) te lezen/scannen :? (Het is php, dus er kan natuurlijk nog een ongedocumenteerde feature zijn, maar al dit gokken hierboven schiet ook niet op.)

Daar staat dat er drie resultaten voor een vergelijking zijn, aangegeven met (<0), (==0) en (>0). Er staat zelfs een voorbeeldje waarin je alleen maar $a/$b door $a['score']/$b['score'] hoeft te vervangen.

[ Voor 16% gewijzigd door Raynman op 09-02-2013 13:53 ]


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

DeepFreeze.NL schreef op vrijdag 08 februari 2013 @ 15:20:
Ja, ik heb dat gelezen, alleen kan ik nergens een oplossing vinden...
Example 1 & 2 samen. Done.
Pagina: 1