Avatar billede exp Juniormester
16. februar 2012 - 20:22 Der er 9 kommentarer

Finde ikke-eksisterende værdi i $array

Hvis jeg har et array der ser således ud:


$array = array(
    0 => 0.50,
    10 => 0.53,
    20 => 0.57,
    30 => 0.64,
    40 => 0.70,
    50 => 0.76,
    60 => 0.81,
    70 => 0.85,
    80 => 0.89,
    90 => 0.92,
    100 => 0.94,
    101 => 0.96);

Og en variabel der ser således ud:

$var = rand(1,200);

Hvordan finder jeg så værdien af $key?

Idéen er, at:
hvis $var = 8 returneres værdien fra $key = 10 (0.53)
hvis $var = 75 returneres værdien fra $key 80 (0.89)
hvis $var = 100 returneres værdien fra $key 100 (0.94)
hvis $var = 101 returneres værdien fra $key 101 (0.96)
hvis $var = 199 returneres værdien fra $key 101 (0.96) - hvis $var>101 returneres værdien fra $key 101
etc
Avatar billede olebole Juniormester
16. februar 2012 - 20:37 #1
<ole>

Det lyder bøvlet. Hvad skal du bruge det til og hvordan? Hvorfra kommer dit array?

/mvh
</bole>
Avatar billede inteeeL Nybegynder
16. februar 2012 - 20:45 #2
<?php

$array = array(
    0 => 0.50,
    10 => 0.53,
    20 => 0.57,
    30 => 0.64,
    40 => 0.70,
    50 => 0.76,
    60 => 0.81,
    70 => 0.85,
    80 => 0.89,
    90 => 0.92,
    100 => 0.94,
    101 => 0.96);

$var = rand(1,200);
$key = ( $var < 100 ? ceil( $var / 10) * 10 : 101);

echo $var.'<br>';
echo $array[$key];

?>


Bemærk at funktionen ceil() bruges, når der rundes op, hvilket jeg antager er formålet.
Avatar billede exp Juniormester
16. februar 2012 - 20:54 #3
@olebole
Det skal bruges til at finde en værdi til sandsynlighedsberegning. $array indeholder kun der $keys, der "ændrer" sandsynligheden, således at den ikke-eksisterende $key(24) indeholder samme værdi som $key(25).

Sagt på en anden måde, så skal $var rundes op til næste eksisterende $key. Findes $var allerede, skal den selvfølgelig ikke runde op til næste $key, men blot benytte den angivne.

@inteeeL
Det skal lige siges, at $key ikke nødvendigvis stiger med 10, men sagtens kan have en mere tilfældigt spring (fx 1,5,10,20,45 etc).
Det kan jeg godt se nu, ikke fremgår så forfærdelig tydeligt i spørgsmålet :-)
Avatar billede olebole Juniormester
16. februar 2012 - 21:37 #4
Det lyder mere og mere bøvlet. Der må være noget, som kan rettes på et tidligere tidspunkt i processen. Det, du lægger op til, virker ikke særlig hensigtsmæssigt
Avatar billede exp Juniormester
16. februar 2012 - 21:45 #5
@olebole
Der er jo muligheden for, at opbygge hele $array'et fra 1 til uendelig, men det er lidt uhensigtsmæssigt, når der så skal rettes i det...

I bund og grund er det bare en række intervaller, hvor jeg gerne vil kunne fange en værdi ud fra en tilfældig $var
16. februar 2012 - 22:40 #6
Det ser ud som om dit array er sorteret med key i stigende rækkefølge, så du kan bare lave et loop indtil du finder key <= $var, og hvis du har rigtig mange elementer kan du optimere søgningen med binary search:
http://en.wikipedia.org/wiki/Binary_search_algorithm

En mere sofistikeret løsning er at have dine data i et Red-Black tree:
http://en.wikipedia.org/wiki/Red%E2%80%93black_tree
Avatar billede inteeeL Nybegynder
16. februar 2012 - 23:21 #7
Følgende kode vil kunne klare et for dig. Dog bør du følge tolamaps' råd ang. binary search, hvis du har mange elementer med.

<?php

$array = array(
    0 => 0.50,
    10 => 0.53,
    20 => 0.57,
    30 => 0.64,
    40 => 0.70,
    50 => 0.76,
    60 => 0.81,
    70 => 0.85,
    80 => 0.89,
    90 => 0.92,
    100 => 0.94,
    101 => 0.96);

function FindNearest($search, $array) {
    $nearest = NULL;
    $last_key = array_shift( array_keys( $array, end($array)));
    if( $search <= $last_key) {
        foreach($array as $key => $value) {
            if( $search <= $key) {
                $nearest = $key;
                break;
            }
        }
    }
    else {
        $nearest = $last_key;
    }
    return $array[$nearest];
}

$var = rand(1,200);

echo $var.' - '.FindNearest( $var, $array);

?>
Avatar billede exp Juniormester
29. oktober 2012 - 11:12 #8
olebole >>
Hvordan vil du funktionen mere hensigtsmæssigt?
Avatar billede olebole Juniormester
29. oktober 2012 - 13:40 #9
Jeg kender ikke opgaven, så det kan jeg ikke svare entydigt på. I spørgsmålet taler du om, at når variablen er over 101, skal værdien for 101 bruges. I #5 taler du så om et uendeligt array(?)

Løsningen på det spørgsmål, du stiller, er (måske) binær træsøgning. En løsning kunne dog ligeså godt involvere et helt andet udgangspunkt - en anden opstilling end den, du viser i spørgsmålet - og ende med at være langt enklere.

Et tænkt spørgsmål kunne lyde: "Hvordan kan jeg flyve uden at have en flyvemaskine?".

Det kunne man sikkert komme med mange fantasifulde forslag til en løsning på. Man kunne også mene, at udgangspunktet er forkert og i stedet svare: "Svøm i stedet!". Men det svar kræver naturligvis, man ved, at spørgeren bare skal finde en måde at komme fra Sjælland til Fyn uden maskineri.

En god og hensigtsmæssig løsning af et problem kræver, man kender baggrunden for problemet. Ellers risikerer man, at der blot lappes lidt på et symptom på det egentlige problem  =)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester





CIO
Stort CIO-interview: Lemvigh-Müllers milliard-omsætning er blevet digital