Just nu i M3-nätverket
Jump to content

Typvärde


Dahlgren

Recommended Posts

Hej!

 

Jag har en array och skulle vilja få fram typvärdet från den, hur gör jag?

 

Arrayen:

$lista = array(79,83,84,87,89,90,91,93,93);

 

Typvärdet här är ju 93, men hur kan jag få fram det dynamiskt? Finns det någon innbyggd funktion i PHP?

 

Mvh

 

Link to comment
Share on other sites

Typvärdet här är ju 93
Hur då? Menar du största värdet i arrayen lr?

 

 

_________

TicoRoman - The One And Only

 

[inlägget ändrat 2003-02-27 19:04:40 av TicoRoman (Almir)]

Link to comment
Share on other sites

-Patrik Johansson-

Typvärdet är det värde som förekommer oftast.

 

/Neox -(Patrik J)

"Gravitation can not be held responsible for people falling in love"
- citat av Albert Einstein

 

Link to comment
Share on other sites

Ok, det visste jag inte. *skäms*

 

Överlåter ursprungsfrågan till någon annan.

 

 

_________

TicoRoman - The One And Only

 

Link to comment
Share on other sites

-Patrik Johansson-

Kan inte PHP men om du använder dig utav två arrayer och en loop som går igenom listan med talen.

Använd sedan någon funktion för att dela upp arrayen, ex strtok()(eller vad det nu heter i Php).

 

Så för varje tal du får fram kollar du om det finns med i den ena arrayen och gör den det ökar du med ett på den plats i den andra arrayen som den första hade.

Skulle den inte finnas så lägger du till den på plats nr i och samtidgt ökar du plats i med ett i den nedre arrayen.

____

Litet exempel.

listan = 12,12,13.

 

Array A = |0|0|0|

Array B = |0|0|0|

 

Sedan loopar du igenom listan, så först får du 12. Kolla om den finns med i A och eftersom den inte gör det lägger du den till den första tomma platsen. Öka sedan samma plats med ett i B. Efteråt skall det då se ut så här.

Array A = |12|0|0|

Array B = |1|0|0|

 

I nästa varv skall du kolla näst element i listan, dvs 12. Detta tal finns nu med i A, så då ökar du den platsen med ett.

Array A = |12|0|0|

Array B = |2|0|0|

 

I det sista varvet får du 13 från listan som inte finns i A och läggs då i första lediga position och samma position ökas med ett i den nedre arrayen.

Array A = |12|13|0|

Array B = |2|1|0|

 

Nu är du har gått genom alla talen är det bara att gå igenom array B för att hitta den position med det mest förekommande talet, här är det 2 som "pekar" på 12.

 

 

/Neox -(Patrik J)

"Gravitation can not be held responsible for people falling in love"
- citat av Albert Einstein

 

Link to comment
Share on other sites

Fungerar, men en mer direkt lösning kan vara följande:

$lista = array(79,83,84,87,89,90,91,93,93);
$num = array_count_values($lista);
arsort($num);
list($typvärde,,,) = each($num);
echo $typvärde;

 

[Ändrat] Jag placerade ett kommatecken fel, och glömde ett a i början på arsort(). Förlåt... :)

 

[inlägget ändrat 2003-02-27 22:11:38 av Cariad]

Link to comment
Share on other sites

Hur den kan skriva ut? Nu förstår inte jag riktigt... :)

 

Menar du att jag ska förklara steg för steg hur den fungerar (för den fungerar väl)?

 

Först använder man en funktion som räknar förekomsten av varje värde i matrisen (array_count_values). Sedan sorterar man resultatmatrisen i omvänd ordning (alltså det högsta värdet först), samtidigt som man behåller associationerna i matrisen (arsort).

 

Sedan hämtar man helt enkelt ut den första posten med list() och each(), och sparar den i $typvärde.

 

Link to comment
Share on other sites

Ja, jag skrev så:

 

 $num = array_count_values($lista);
 rsort($num);
 list(,$typvarde,,) = each($num);
 print $num;

 

Men fick fel...

 

Link to comment
Share on other sites

Om du läser om mitt inlägg med exempelkoden ovan, så ändrade jag det ganska precis efter att jag skrev den, då jag skrev några små fel... Du måste ha fått koden från e-post-notifieringen. ;)

 

Link to comment
Share on other sites

Ja så var det, nu fungerar det. Nu är det bara så att jag försökte ta bort din array och använda mig utav den array jag använde innan i scriptet men då fick jag ett fel som lyder såhär:

 

Warning: Can only count STRING and INTEGER values!

 

Koden jag använder är följande: (din kodbit i slutet)

 

<?php
 $lista = array(116,83,84,87,89,90,91,93,83);
 $antal = count($lista)/2;
 sort($lista);
 If (is_int($antal)) {
    $median=round(((($lista[$antal-1])+$lista[$antal])/2),1);
    print "<b>Median: </b>$median";
 }
 else {
    print "<b>Median: </b>";
    print $median=$lista[round($antal)];
 }
 $antal=$antal*2;
 $total=round((array_sum($lista)/$antal),1);
 print "<b><p>Medelvärde: </b>$total<p>";
 for($i=0;$i<$antal;$i++) {
     $lista[$i]=pow(($lista[$i]-$total),2);
 }
 $total=round(sqrt(array_sum($lista)/($antal-1)),1);
 print "<b>Standardavvikelsen: </b>$total<p>";


 $num = array_count_values($lista);
 arsort($num);
 list($typvarde,,,) = each($num);
 echo $typvarde;
?>

 

Link to comment
Share on other sites

För det första så underlättar det om du anger på vilken rad felet uppstod (det står i felmeddelandet).

 

Problemet ligger i att du faktiskt ersätter värderna i $lista på rad 17. Där byter du ut dem mot flytpunktsvariabler, och sådana kan du inte räkna med array_count_values(). Detta för att en flytpunktsvariabel aldrig kan vara exakt likadan som en annan, vilket skulle få resultatet att varje värde bara förekommer en gång, och det finns då inget typvärde.

 

Är det detta du vill, få fram typvärdet ur decimaltal? Då får du först avrunda dem till önskat antal decimaler, multiplicera med samma antal, så att du får ett heltal (integer), sedan göra array_count_values, och räkna tillbaka vid utskriften.

 

Om inte, så får du ju helt enkelt bara byta namn på variabeln på rad 17, så att den inte skriver över den gamla.

 

Link to comment
Share on other sites

Ja just det, nu fungerar det :) tack så mycket. Det är ett problem till. Om det står exempelvis: 12,13,12,13,43,22 då är det ju i detta fall två typvärden; 12 och 13. Hur skulle man kunna lösa detta?

 

Mvh

 

Link to comment
Share on other sites

Då får du lägga in en loop, som hämtar ut alla typvärden.

Nedan har jag valt att spara dem i en sträng, men du kan ju göra om så att de sparas som en matris om det är bättre (vet inte vad du ska använda det till). Fördelen med om du använder dig av en matris är att du enkelt kan kontrollera om originalmatrisen innehöll ett typvärde över huvud taget (annars kommer ju count($lista) == count($typvärden)).

 

$lista = array(12,13,12,13,43,22);
$num = array_count_values($lista);
arsort($num);
$max = 0; unset($typvärden);
while (true) {
list($typvärde,$ant,,) = each($num);
if ($ant < $max) break;
$max = $ant;
if (isset($typvärden)) $typvärden .= ",{$typvärde}";
else $typvärden = $typvärde;
}
echo $typvärden;

 

[Tillägg] Hade tråkigt ;), så jag gjorde en matris-version av koden ovan:

$lista = array(12,13,12,13,43,22);
$num = array_count_values($lista);
arsort($num);
$max = 0; $typvärden = array();
while (true) {
list($typvärde,$ant,,) = each($num);
if ($ant < $max) break;
$max = $ant;
$typvärden[] = $typvärde;
}
if (count($lista) == count($typvärden))
echo "Inget typvärde";
else
echo implode(",", $typvärden);

 

[inlägget ändrat 2003-02-28 08:52:16 av Cariad]

Link to comment
Share on other sites

Den fungerade utmärkt, det här måste du vara väldigt insatt i :) Vad gör det egentligen för skillnad om jag använder den första eller den andra koden du skrev? Är det bättre med matris-version?

 

Link to comment
Share on other sites

det här måste du vara väldigt insatt i :)
Cariad är insatt i det mesta när det gäller PHP. :)

 

 

_________

TicoRoman - The One And Only

 

Link to comment
Share on other sites

Cariad är insatt i det mesta när det gäller PHP

Stämmer bra det ;)

Har faktiskt aldrig använt mig av array_count_values() tidigare...

 

Gren, jag skulle nog personligen använda mig av matris-versionen, då denna är mer konfigurerbar. Den tar sannolikt lite mer minne, och är lite långsammare i exemplet ovan, men om du skulle utveckla det och återanvända typvärderna flera gånger kommer du att vinna i enkelhet, snabbhet och minnesanvändning med matris-versionen.

 

Men för dig i dagsläget verkar det inte spela någon större roll, så ta den som du förstår bäst :)

 

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.



×
×
  • Create New...