[php] array key 2 wordt 1 en 3 blijft 3 (poging 2)

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ajakkes
  • Registratie: Maart 2004
  • Laatst online: 16-05 22:32
Ik ben bezig met een functie waarbij ik op basis van een waarde 2 dimensionale array wil sorteren. Ik heb al het een en ander geprobeerd maar het gaat mis op een punt wat ik niet begrijp.

$arraykey = (1.1-$language_list)*10;
geeft een nette opeenvolgende lijst met keys waarbij de eerste key 1 is.

$arraykey = (1-$language_list)*10;
geeft een lijst met keys waarbij de eerste key 0 is zoals het hoort maar waarbij de value van key 1 de value van key 0 overschrijft. value van key 2 overschrijft key 1 maar de value van key 3 komt netjes in key 3

Ik snap niet hoe dit kan.

de code is
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function testKeys(){
$languages = '0.5,0.4,0.6,0.7,0.8,0.0,0.3,1.0,0.9,0.1,0.2';
$languages = explode( ",", $languages );
$count=0;
foreach ( $languages as $language_list ){
$arraykey = (1.1-$language_list)*10;
//$arraykey = (1-$language_list)*10;
$user_languages[$arraykey] = $count;
$count++;
}
ksort($user_languages);
return $user_languages;
}


output
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
25
26
27
28
29
zoals verwacht:(not commented)
Array
(
    [1] => 7
    [2] => 8
    [3] => 4
    [4] => 3
    [5] => 2
    [6] => 0
    [7] => 1
    [8] => 6
    [9] => 10
    [10] => 9
    [11] => 5
)
fout:(commented)
Array
(
    [0] => 8
    [1] => 4
    [3] => 3
    [4] => 2
    [5] => 0
    [6] => 1
    [7] => 6
    [8] => 10
    [9] => 9
    [10] => 5
)

👑


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Zit je niet gewoon met afronding van floating point getallen te klooien? 1.1 - 0.5 hoeft niet per se precies 0.6 te zijn... en als je dat dan cast naar int (door het te gebruiken als array-key) kan het zijn dat je dan dus met 0.599999*10 uiteindelijk 5 ipv 6 krijgt.

Acties:
  • 0 Henk 'm!

  • ajakkes
  • Registratie: Maart 2004
  • Laatst online: 16-05 22:32
Dus om dat te controleren moet ik eerst $arrayKey forcen naar een integer en deze controleren.

(1 - 0.8) * 10 != 2 maar 1.999~

👑


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Dat forceren naar integer doe je al :P Ik zou het netjes afronden naar integer. Of wellicht nog beter, in je invoer al met gehele getallen werken, indien mogelijk.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
ajakkes schreef op dinsdag 26 oktober 2010 @ 14:56:
Dus om dat te controleren moet ik eerst $arrayKey forcen naar een integer en deze controleren.

(1 - 0.8) * 10 != 2 maar 1.999~
Er staat ook het een en ander over floats in onze Faq: Programming FAQ - Getallen en talstelsels

Je zult dus niet zomaar kunnen afkappen ( wat een cast naar int wel doet ), maar zult moeten afronden.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • ajakkes
  • Registratie: Maart 2004
  • Laatst online: 16-05 22:32
settype($arraykey,"integer");

Dit laat inderdaad zien dat float 2 integer 1 is.

Bedankt

Edit
code:
1
2
3
4
5
$arraykey = (1-$language_list)*10; 
vervangen door:
$arraykey = $language_list*10;
$arraykey = 10-$language_list;
biedt de oplossing

[ Voor 47% gewijzigd door ajakkes op 26-10-2010 16:54 ]

👑

Pagina: 1