Avatar billede Lasse S Novice
14. oktober 2004 - 15:12 Der er 9 kommentarer og
1 løsning

finde højeste værdi i array

Hej eksperter

Jeg har et to-dimensionelt array:

$ugedag['man']['morgen'] = 5;
$ugedag['man']['aften'] = 3;
$ugedag['tir']['morgen'] = 7;
$ugedag['tir']['aften'] = 9;

Jeg vil gerne finde den højeste værdi, uanset dag på ugen og tidspunkt på dagen (skal bruges til at beregne de enkelte værdiers procent-størrelse af ugens maxværdi)

Jeg skriver:

$newarr = array_merge($ugedag['man'], $ugedag['tir']);
rsort($newarr);
echo $newarr[0];

Findes der en mere elegant funktion til at finde den højeste værdi i fler-dimensionelt array, uanset i hvliken forgrening af arrayet, at denne værdi befinder sig?

:o) Lasse
Avatar billede bojo Nybegynder
14. oktober 2004 - 15:42 #1
uden at jeg kender den prøv arsort

Description
bool arsort ( array array [, int sort_flags])


This function sorts an array such that array indices maintain their correlation with the array elements they are associated with. This is used mainly when sorting associative arrays where the actual element order is significant.

Returns TRUE on success or FALSE on failure.
Avatar billede jakobdo Ekspert
14. oktober 2004 - 16:26 #2
Hvis du har fler-dimensionelt, så kan du bruge denne:

array_multisort()

arsort sortere blot et enkelt array i reverse order.
Avatar billede bojo Nybegynder
14. oktober 2004 - 16:28 #3
det var jo også det jeg ville have sagt :-)
Avatar billede Lasse S Novice
14. oktober 2004 - 17:05 #4
Havde også kigget på den, men hvordan skal jeg bruge den? Skriver jeg:

array_multisort($ugedag, SORT_DESC, SORT_NUMERIC);
print_r($ugedag);

får jeg resultatet:

Array ( [tir] => Array ( [morgen] => 7 [aften] => 9 ) [man] => Array ( [morgen] => 5 [aften] => 3 ) )

Altså sorteres tirsdag før mandag (desc), men jeg er jo ikke interesseret i tirsdag men i værdien 9 (højeste værdi)...
Avatar billede Lasse S Novice
14. oktober 2004 - 17:06 #5
og jeg vil gerne kunne finde værdien 9 i fx $ugedag[0][0], altså numerisk, ikke associativt, da jeg jo ikke kender den associative placering (mandag, tirsdag..)
Avatar billede 7th Praktikant
15. oktober 2004 - 17:33 #6
Her er en mulig løsning.

$result = array();

$ugedag['man']['morgen'] = 2;
$ugedag['ons']['morgen'] = 3;
$ugedag['tir']['aften'] = 9;
$ugedag['tir']['morgen'] = 7;
$ugedag['man']['aften'] = 8;
$ugedag['ons']['aften'] = 5;

foreach ($ugedag as $value1)
{
    foreach ($value1 as $value2)
    {
        $result[] = $value2;
    }
}

rsort($result);
reset($result);

echo $result[0];

Hvis du også skal bruge tir og aften, kunne du for eksempel udbygge $result til et multidimensional array, eksempelvis $result[$value2]['dag'] = xxx; og $result[$value2]['tid'] = xxx, hvis du forstår. Anyway håber det kan hjælpe dig på vej :)
Avatar billede 7th Praktikant
15. oktober 2004 - 18:14 #7
Her er en anden med dag og tid. Det lidt tricky med denne er sorteringen. Her dur rsort() ikke, da den sletter index keys, som jo indeholder værdierne.

$ugedag['man']['morgen'] = 2;
$ugedag['tir']['morgen'] = 4;
$ugedag['ons']['morgen'] = 6;
$ugedag['tor']['morgen'] = 8;
$ugedag['fre']['morgen'] = 10;
$ugedag['man']['aften'] = 9;
$ugedag['tir']['aften'] = 7;
$ugedag['ons']['aften'] = 5;
$ugedag['tor']['aften'] = 3;
$ugedag['fre']['aften'] = 1;

$result = array();

foreach ($ugedag as $key1 => $value1)
{
    foreach ($value1 as $key2 => $value2)
    {
        $result[$value2]['dag'] = $key1;
        $result[$value2]['tid'] = $key2;
    }
}

function sort_asc($a , $b)
{
    if ($a == $b)
    {
        return 0;
    }

    return ($a > $b) ? -1 : 1;
}

uksort($result , "sort_asc");
reset($result);
$first = each($result);

echo $first[0]." - ".$first[1]['dag']." - ".$first[1]['tid'];
Avatar billede Lasse S Novice
16. oktober 2004 - 23:09 #8
Jeg skrev i forvejen selv

$newarr = array_merge($ugedag['man'], $ugedag['tir']);
rsort($newarr);
echo $newarr[0];

og løsningen med 2*foreach synes jeg ikke er mere elegant.. Der findes altså ikke en funktion, der bare tager den højeste værdi fra en vilkårlig poosition i et array?
Avatar billede 7th Praktikant
17. oktober 2004 - 08:03 #9
Tjo, men jeg forstod det som at du også skulle bruge ['dag'] og ['tid'], men hvis det ikke er tilfældet, så gør det jo tingene lidt lettere :) Jeg ret sikker på, at der findes en funktion som sortere efter værdier. Ellers kunne du også kigge på usort, som er noget lignende uksort() funktionen.

Iøvrigt har jeg lige et spørgsmål. Dit multidimensionale array, $ugedag['dag']['tid'] = værdi, skal det se således ud? Hvis ikke, kunne du jo lave det således.

$ugedag[værdi]['dag'] = dag;
$ugedag[værdi]['tid'] = tid;

Så skulle du gerne få den højeste værdi ved

function sort_asc($a , $b)
{
    if ($a == $b)
    {
        return 0;
    }

    return ($a > $b) ? -1 : 1;
}

uksort($result , "sort_asc");
reset($result);
$first = each($result);

echo $first[0]." - ".$first[1]['dag']." - ".$first[1]['tid'];
Avatar billede 7th Praktikant
18. oktober 2004 - 18:28 #10
Dette er mit bedste bud.

$ugedag['man']['morgen'] = 2;
$ugedag['man']['aften'] = 5;
$ugedag['tir']['morgen'] = 4;
$ugedag['tir']['aften'] = 7;
$ugedag['ons']['morgen'] = 6;
$ugedag['ons']['aften'] = 9;

$result = array_values($ugedag);

rsort($result);
reset($result);

list($key , $value) = each($result);

echo $value['aften'] > $value['morgen'] ? $value['aften'] : $value['morgen'];
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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