Versio

float-versie van levenshtein()

Overzicht Reageren

Eddy Erkelens

Eddy Erkelens

19/08/2008 10:55:00
Quote Anchor link
Voor diegene die levenshtein() niet kennen: http://nl.php.net/manual/en/function.levenshtein.php
Ik zag deze functie vanochtend ook pas voor het eerste.

Ik heb namelijk een functie nodig die het getal uit een array haalt die het dichtste bij het gemiddelde zit.
Dat kan met de functie average() (zonet gepost in Snippets).

Maar stel... ik heb dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$array
= array(6, 4, 8, 3, 4, 3.5, 9.25, 10, 8);
$gemiddelde = average($array); // geeft 6.19444444444
$getal = $gemiddelde; // of een ander getal, vandaar deze regel!
$getal_dichtst_bij = nieuwe_functie($getal, $array); // zou key1=6 moeten geven
?>



Online voorbeeld op http://www.zunflappie.nl/temp/average.php

Maar hoe moet ik die nieuwe_functie() invullen?
Uiteraard krijgen ze beide getallen mee... zodat je ook kan zoeken naar welk getal het dichtste bij $getal ligt.
Die Levenshtein() doet zoiets met strings, maar is er zoiets ook voor getallen (floats!)?

Met range() kan je wel iets bereiken, maar daarmee is het einde zoek.
Arrays gaan opstellen met mogelijke antwoorden is onbegonnen werk (zeker bij een getal als in het voorbeeld (6.19xxxxxxxxxxxx)).
Gewijzigd op 01/01/1970 01:00:00 door Eddy Erkelens
 
PHP hulp

PHP hulp

24/05/2012 16:26:45
Gesponsorde koppelingen:
 
Emmanuel Delay

Emmanuel Delay

19/08/2008 11:22:00
Quote Anchor link
Je moet ze dan wel goed gebruiken. Arrays moeten echte arrays zijn, niet met een key offset. De waarden moeten echte getallen zijn.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
30
31
32
33
34
35
<?php
$array
= array(6, 4, 8, 3, 4, 3.5, 9.25, 10, 8);
$gemiddelde = array_average($array); // geeft 6.19444444444
$getal = $gemiddelde; // of een ander getal, vandaar deze regel!
$getal_dichtst_bij = nieuwe_functie($getal, $array); // zou key1=6 moeten geven
echo 'gemiddelde: '. $gemiddelde .
      '<br/>dichtst bij: '. $getal_dichtst_bij;
function
nieuwe_functie($gemiddelde, $getallen)
{

  $beste_verschil = -1;
  $index = -1;
  $i = 0;
  foreach ($getallen as $getal)
  {

    $verschil = abs($getal - $gemiddelde);
    if ($verschil == 0)
      return $getal;
    if ($beste_verschil == -1 || $beste_verschil > $verschil)
      {

      $beste_verschil = $verschil;
      $index = $i;
      }

    $i++;
  }

  return $getallen[$index];
}

function
array_average($arr)
{

$sum = array_sum($arr);
$num = sizeof($arr);
return $sum/$num;
}


?>
Gewijzigd op 01/01/1970 01:00:00 door Emmanuel Delay
 
Robert Deiman

Robert Deiman

19/08/2008 11:41:00
Quote Anchor link
@Emmanuel

Waarom gebruik je dan niet foreach met $key => $value, dat is betrouwbaarder dan zoals jij het doet, en het maakt op zich dan niet uit hoe de keys in elkaar steken.
 
Emmanuel Delay

Emmanuel Delay

19/08/2008 11:46:00
Quote Anchor link
Kan ook, ja.
 
Eddy Erkelens

Eddy Erkelens

19/08/2008 19:20:00
Quote Anchor link
Ik heb script online staan, in combinatie met average().
Zie http://www.zunflappie.nl/temp/getal_uit_array_nabij_getal.php

Daar heb ik het een getal opgeven om te zoeken. Dat getal zie je ook onderaan in de zin opgegeven.

Maar hij komt dus op een verkeerd getal uit.
De reden hiervoor? Geen idee, maar om eerlijk te zijn snap ik de logica van het script (zoals hierboven) ook niet.

Tevens heb ik nog niet echt een toepasselijke naam voor de functie gevonden. Iemand een betere (en vooral kortere) omschrijving?

@ Robert Deiman, hoe zou jij het dan?
Gewijzigd op 01/01/1970 01:00:00 door Eddy Erkelens
 
Emmanuel Delay

Emmanuel Delay

19/08/2008 20:16:00
Quote Anchor link
Ik heb een andere functie dan average. Bij jou (hier: http://www.zunflappie.nl/temp/getal_uit_array_nabij_getal.php) is die average een array, bij mij is dat 1 getal, namelijk het gemiddelde.

Probeer eens met mijn average functie, want ik weet niet wat die van jou doet.

Zie dan nog eens wat er gebeurt.

Als je wil weten wat er bij mij gebeurt:
-Je berekent het gemiddelde. Dat is 1 getal.
-Je doorloopt een foreach lus, voor elk element van de array.
*Bij elk element bekijk je het verschil met het gemiddelde.
*je houdt bij bij welk element dat verschil minimaal is.
*dat element geef je weer.

aan nieuwe_functie() geef je het getal mee dat je wil zoeken. In mijn geval is dat dus die average. Indien je iets anders wil, moet je dat getal maar mee geven en heb je die average niet meer nodig.
Gewijzigd op 01/01/1970 01:00:00 door Emmanuel Delay
 



Overzicht Reageren

Get Adobe Flash player