Oprettet ons. d. 01. april 2009 kl. 16:48:44

hoppe11
hoppe11 (4.375 point. Point ude: 530)

sortere flerdimensionelt array

hvordan er det muligt at sortere et flerdimensionelt array?

eks.
$arr[0] = [2, 4];
$arr[1] = [0, 1];
$arr[2] = [7, 2];
$arr[3] = [3, 5];
$arr[4] = [3, 7];

jeg skal så sortere mit array med den første værdi som første prioritet og med anden værdi som anden prioritet (hvis der skulle forekomme flere med samme første værdi)

$arr[2] = [7, 2];
$arr[4] = [3, 7];
$arr[3] = [3, 5];
$arr[0] = [2, 4];
$arr[1] = [0, 1];

Skrevet ons. d. 01. april 2009 kl. 17:00:58| #1

arne_v
arne_v (1.005.403 point)
proev med:

usort($arr, "cmp");

hvor:


function cmp($a, $b) {
    if($a[0] < $b[0]) {
        return -1;
    } else if($a[0] > $b[0]) {
        return 1;
    } else {
        if($a[1] < $b[1]) {
            return -1;
        } else if($a[1] > $b[1]) {
            return 1;
        } else {
            return 0;
        }
    }
}

Skrevet ons. d. 01. april 2009 kl. 19:29:07| #2

hoppe11
hoppe11 (4.375 point)
det fungerer ikke helt

$arr = array(
    0 => array(2,4),
    1 => array(0,19),
    2 => array(7,2),
    3 => array(3,5),
    4 => array(3,7)
    );

echo '<pre>';
print_r($arr);
echo '</pre>';

function cmp($a, $b) {
    if($a[0] < $b[0]) {
        return -1;
    } else if($a[0] > $b[0]) {
        return 1;
    } else {
        if($a[1] < $b[1]) {
            return -1;
        } else if($a[1] > $b[1]) {
            return 1;
        } else {
            return 0;
        }
    }
}

usort($arr, "cmp");

echo '<pre>';
print_r($arr);
echo '</pre>';

Skrevet ons. d. 01. april 2009 kl. 19:30:45| #3

hoppe11
hoppe11 (4.375 point)
den skal køre "asc"

Skrevet ons. d. 01. april 2009 kl. 19:34:43| #4

hoppe11
hoppe11 (4.375 point)
er det her korrekt? :)

function cmp($a, $b)
{
    if($a[0] < $b[0]) return 1;
    elseif($a[0] > $b[0]) return -1;
    else
    {
        if($a[1] < $b[1]) return 1;
        elseif($a[1] > $b[1]) return -1;
        else return 0;
    }
}

Skrevet ons. d. 01. april 2009 kl. 19:51:55| #5

arne_v
arne_v (1.005.403 point)
Koden i #2 sorterer ASC hos mig.

Mener du DESC ?

I saa fald er det bare at bytte om paa 1 og -1.

Skrevet ons. d. 01. april 2009 kl. 19:52:48| #6

arne_v
arne_v (1.005.403 point)
cmp kan vist ioevrigt kortes lidt ned naar det er tal, da man bare kan traekke dem fra hinanden.

Skrevet ons. d. 01. april 2009 kl. 21:15:42| #7

hoppe11
hoppe11 (4.375 point)
ja, jeg skrev forkert først.. mente DESC

scriptet virker fint nu, men den "nulstiller" alle keys i første dimension i arrayet.. :(

Skrevet ons. d. 01. april 2009 kl. 21:20:13| #8

hoppe11
hoppe11 (4.375 point)
nøglen i første dimension virker som et id

men hvordan kan det kortes ned?

Skrevet ons. d. 01. april 2009 kl. 21:44:32| #9

hoppe11
hoppe11 (4.375 point)
eneste mulighed for at sortere på den her måde er så at flytte alle værdier inkl. id'et ud på samme "dimension"?

Skrevet ons. d. 01. april 2009 kl. 21:49:01| #10

arne_v
arne_v (1.005.403 point)
function cmp($a, $b) {
    if($a[0] == $b[0]) {
        return $b[1] - $a[1];
    } else {
        return $b[0] - $a[0];
    }
}

Skrevet ons. d. 01. april 2009 kl. 21:57:27| #11

hoppe11
hoppe11 (4.375 point)
hvordan vil cmp-funktionen se ud hvis jeg smider alle tre værdier på række?

altså

cmp($a, $b, $c)

- hvor $a er mit id og $b og $c er dem jeg skal sortere efter...

Skrevet ons. d. 01. april 2009 kl. 22:00:21| #12

hoppe11
hoppe11 (4.375 point)
min struktur ser nu således ud:

Array
(
    [0] => Array
        (
            [0] => 23006
            [1] => 1
            [2] => 3
        )

    [1] => Array
        (
            [0] => 11258
            [1] => 3
            [2] => 1
        )

    [2] => Array
        (
            [0] => 26394
            [1] => 1
            [2] => 3
        )

    [3] => Array
        (
            [0] => 49385
            [1] => 1
            [2] => 5
        )

    [4] => Array
        (
            [0] => 70468
            [1] => 1
            [2] => 1
        )

    [5] => Array
        (
            [0] => 50911
            [1] => 1
            [2] => 1
        )

    [6] => Array
        (
            [0] => 74502
            [1] => 1
            [2] => 1
        )

)

Skrevet ons. d. 01. april 2009 kl. 22:09:13| #13

arne_v
arne_v (1.005.403 point)
function cmp($a, $b) {
    if($a[0] == $b[0]) {
        if($a[0] == $b[0]) {
            return $b[2] - $a[2];
        } else {
            return $b[1] - $a[1];
        }
    } else {
        return $b[0] - $a[0];
    }
}

Skrevet ons. d. 01. april 2009 kl. 22:12:31| #14

hoppe11
hoppe11 (4.375 point)
jeg er ikke helt med? kunne man ikke "springe over" første værdi og sortere efter [1] og [2] i stedet? har mit id på [0]

Skrevet ons. d. 01. april 2009 kl. 22:13:42| #15

hoppe11
hoppe11 (4.375 point)
hov undskyld.. :)

resultatet på den seneste bliver sådan her

Array
(
    [0] => Array
        (
            [0] => 74502
            [1] => 1
            [2] => 1
        )

    [1] => Array
        (
            [0] => 70468
            [1] => 1
            [2] => 1
        )

    [2] => Array
        (
            [0] => 50911
            [1] => 1
            [2] => 1
        )

    [3] => Array
        (
            [0] => 49385
            [1] => 1
            [2] => 5
        )

    [4] => Array
        (
            [0] => 26394
            [1] => 1
            [2] => 3
        )

    [5] => Array
        (
            [0] => 23006
            [1] => 1
            [2] => 3
        )

    [6] => Array
        (
            [0] => 11258
            [1] => 3
            [2] => 1
        )

)

Array
(
    [0] => Array
        (
            [0] => 74502
            [1] => 1
            [2] => 1
        )

    [1] => Array
        (
            [0] => 70468
            [1] => 1
            [2] => 1
        )

    [2] => Array
        (
            [0] => 50911
            [1] => 1
            [2] => 1
        )

    [3] => Array
        (
            [0] => 49385
            [1] => 1
            [2] => 5
        )

    [4] => Array
        (
            [0] => 26394
            [1] => 1
            [2] => 3
        )

    [5] => Array
        (
            [0] => 23006
            [1] => 1
            [2] => 3
        )

    [6] => Array
        (
            [0] => 11258
            [1] => 3
            [2] => 1
        )

)

Skrevet ons. d. 01. april 2009 kl. 22:18:36| #16

arne_v
arne_v (1.005.403 point)
sorry - jeg troede at du ville sortere efter alle felter

function cmp($a, $b) {
    if($a[1] == $b[1]) {
        return $b[2] - $a[2];
    } else {
        return $b[1] - $a[1];
    }
}

Skrevet ons. d. 01. april 2009 kl. 22:21:04| #17

hoppe11
hoppe11 (4.375 point)
helt kanon.. det virker :)

jeg skal vist lige ind i den callback-ting her

smid et svar..

Skrevet ons. d. 01. april 2009 kl. 22:26:16| #18


Skrevet ons. d. 01. april 2009 kl. 22:27:26| #19

arne_v
arne_v (1.005.403 point)
Hvis du brugte strenge som keys paa de indre arrays fremfor integers saa ville det maaske forbedre laesbarheden.

Hvis det skal vaere integers saa bruge konstanter.

Skrevet ons. d. 01. april 2009 kl. 22:35:08| #20

hoppe11
hoppe11 (4.375 point)
hvad mener du? er ikke helt med?

Skrevet ons. d. 01. april 2009 kl. 22:39:18| #21

arne_v
arne_v (1.005.403 point)
strenge eller konstanter ?

Skrevet ons. d. 01. april 2009 kl. 22:46:58| #22

hoppe11
hoppe11 (4.375 point)
hvordan vil du bruge en konstant i eksemplet her?

men du mener at søgetiden ville optimeres hvis det var tekststrenge?

vil du ikke prøve at lave et eksempel med en array struktur?

Skrevet ons. d. 01. april 2009 kl. 23:01:19| #23

arne_v
arne_v (1.005.403 point)
Nej - performance ville snaere blive ringere (men det vil skulle maales i milliardtedele sekunder)  - men koden ville blive nemme at laese.

Skrevet ons. d. 01. april 2009 kl. 23:01:42| #24

arne_v
arne_v (1.005.403 point)
Jeg kan lave et par eksempler.

Om en 3-4 timer.

Skrevet ons. d. 01. april 2009 kl. 23:14:22| #25


Skrevet tor. d. 02. april 2009 kl. 21:27:20| #26

arne_v
arne_v (1.005.403 point)
Det tog lidt laengere tid.

:-)

Skrevet tor. d. 02. april 2009 kl. 21:27:30| #27

arne_v
arne_v (1.005.403 point)
<?php
$arr = array(0 => array( 0 => 23006, 1 => 1, 2 => 3),
            1 => array( 0 => 11258, 1 => 3, 2 => 1),
            2 => array( 0 => 26394, 1 => 1, 2 => 3),
            3 => array( 0 => 49385, 1 => 1, 2 => 5),
            4 => array( 0 => 70468, 1 => 1, 2 => 1),
            5 => array( 0 => 50911, 1 => 1, 2 => 1),
            6 => array( 0 => 74502, 1 => 1, 2 => 1));

echo "<pre>\r\n";
foreach($arr as $elm) {
    echo $elm[0] . " " . $elm[1] . " " . $elm[2] . "<br>\r\n";
}
echo "</pre>\r\n";

function cmp($a, $b) {
    if($a[1] == $b[1]) {
        return $b[2] - $a[2];
    } else {
        return $b[1] - $a[1];
    }
}

usort($arr, "cmp");

echo "<pre>\r\n";
foreach($arr as $elm) {
    echo $elm[0] . " " . $elm[1] . " " . $elm[2] . "<br>\r\n";
}
echo "</pre>\r\n";
?>

Skrevet tor. d. 02. april 2009 kl. 21:27:41| #28

arne_v
arne_v (1.005.403 point)
<?php
$arr = array(0 => array( 'id' => 23006, 'v1' => 1, 'v2' => 3),
            1 => array( 'id' => 11258, 'v1' => 3, 'v2' => 1),
            2 => array( 'id' => 26394, 'v1' => 1, 'v2' => 3),
            3 => array( 'id' => 49385, 'v1' => 1, 'v2' => 5),
            4 => array( 'id' => 70468, 'v1' => 1, 'v2' => 1),
            5 => array( 'id' => 50911, 'v1' => 1, 'v2' => 1),
            6 => array( 'id' => 74502, 'v1' => 1, 'v2' => 1));

echo "<pre>\r\n";
foreach($arr as $elm) {
    echo $elm['id'] . " " . $elm['v1'] . " " . $elm['v2'] . "<br>\r\n";
}
echo "</pre>\r\n";

function cmp($a, $b) {
    if($a['v1'] == $b['v1']) {
        return $b['v2'] - $a['v2'];
    } else {
        return $b['v1'] - $a['v1'];
    }
}

usort($arr, "cmp");

echo "<pre>\r\n";
foreach($arr as $elm) {
    echo $elm['id'] . " " . $elm['v1'] . " " . $elm['v2'] . "<br>\r\n";
}
echo "</pre>\r\n";
?>

Skrevet tor. d. 02. april 2009 kl. 21:27:51| #29

arne_v
arne_v (1.005.403 point)
<?php
define('ID', 0);
define('V1', 1);
define('V2', 2);

$arr = array(0 => array( ID => 23006, V1 => 1, V2 => 3),
            1 => array( ID => 11258, V1 => 3, V2 => 1),
            2 => array( ID => 26394, V1 => 1, V2 => 3),
            3 => array( ID => 49385, V1 => 1, V2 => 5),
            4 => array( ID => 70468, V1 => 1, V2 => 1),
            5 => array( ID => 50911, V1 => 1, V2 => 1),
            6 => array( ID => 74502, V1 => 1, V2 => 1));

echo "<pre>\r\n";
foreach($arr as $elm) {
    echo $elm[ID] . " " . $elm[V1] . " " . $elm[V2] . "<br>\r\n";
}
echo "</pre>\r\n";

function cmp($a, $b) {
    if($a[V1] == $b[V1]) {
        return $b[V2] - $a[V2];
    } else {
        return $b[V1] - $a[V1];
    }
}

usort($arr, "cmp");

echo "<pre>\r\n";
foreach($arr as $elm) {
    echo $elm[ID] . " " . $elm[V1] . " " . $elm[V2] . "<br>\r\n";
}
echo "</pre>\r\n";
?>

Skrevet tor. d. 02. april 2009 kl. 21:51:01| #30

arne_v
arne_v (1.005.403 point)
<?php
class Data {
    public $id;
    public $v1;
    public $v2;
    public function __construct($idarg, $v1arg, $v2arg) {
        $this->id = $idarg;
        $this->v1 = $v1arg;
        $this->v2 = $v2arg;
    }
}

$arr = array(new Data( 23006, 1, 3),
            new Data( 11258, 3, 1),
            new Data( 26394, 1, 3),
            new Data( 49385, 1, 5),
            new Data( 70468, 1, 1),
            new Data( 50911, 1, 1),
            new Data( 74502, 1, 1));

echo "<pre>\r\n";
foreach($arr as $elm) {
    echo $elm->id . " " . $elm->v1 . " " . $elm->v2 . "<br>\r\n";
}
echo "</pre>\r\n";

function cmp($a, $b) {
    if($a->v1 == $b->v1) {
        return $b->v2 - $a->v2;
    } else {
        return $b->v1 - $a->v1;
    }
}

usort($arr, "cmp");

echo "<pre>\r\n";
foreach($arr as $elm) {
    echo $elm->id . " " . $elm->v1 . " " . $elm->v2 . "<br>\r\n";
}
echo "</pre>\r\n";
?>

Skrevet tor. d. 02. april 2009 kl. 21:51:50| #31

arne_v
arne_v (1.005.403 point)
Det sidste kunne goeres noget paenere ved at bruge noget ordentlig encapsulation.

Men min hoved pointe er bare at [1] og [2] i cmp ikke er specielt laesbar kode.

Skrevet fre. d. 03. april 2009 kl. 11:23:01| #32

hoppe11
hoppe11 (4.375 point)
nej ok.. kan godt se hvad du mener med konstanter :)

har aldrig anvendt konstanter før, men kunne være man skulle overveje det

tak for eksemplerne

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

Opskrifter - ingredienser i PHP

Oprettet den 9. februar 2012 kl. 22.25
mik2000 giver 100 point for svar | Giv et svar »

Lille webservice

Oprettet den 9. februar 2012 kl. 19.33
torbennielsen666 giver 60 point for svar | Giv et svar »

setcookie ?? til auto login

Oprettet den 9. februar 2012 kl. 19.12
bigtime giver 30 point for svar | Giv et svar »

Seneste guides

Installer win 7
Den gode bruger


   




Tips & Tricks fra PC World

Teaser billede

Gør dig selv en tjeneste: Køb et ordentligt SD-kort

Der kan være meget stor hastighedsforskel på to umiddelbare ens SD-kort. Se her hvad du skal være opmærksom på, når du køber ekstra hukommelse til din mobil, tablet eller kamera.


Anmeldelser fra PC World

Teaser billede

Test: Denne super-tablet er iPads hårdeste konkurrent

Eee Pad Transformer Prime er frygtindgydende med sin quadcore processor og evne til at trylle sig om til bærbar. Apple bør kigge i bagspejlet, for Asus' tablet-pc kommer buldrende - og gør det...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Gratis flysimulator fra Microsoft

Den legendariske Flight Simulator fra Microsoft genopstår den 29. februar - og denne gang er spillet gratis.


Nyheder fra Computerworld

Teaser billede

Bank: Derfor er login uden NemID helt i orden

Der er ikke hold i påstanden om sikkerhedsproblemer i forbindelse med bankkunders login uden brug af NemID, lyder det fra Nykredit Bank.


Kurser
Samarbejdspartnere

Udgiver · © 2012 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301 · Brug af personoplysninger