Avatar billede jenslyn_s Nybegynder
29. april 2005 - 09:37 Der er 15 kommentarer og
1 løsning

Sortere multidimensionelt array

Jeg skal have sorteret mit array, og kan ikke greje hvilken funktion jeg skal bruge og hvordan.
mit array:

$array[] = array(
                "ID" => $val,
                "pos" => $pos,
                "neg" => $neg
                );
eks. på indhold:
[0][ID = 50][pos = 16][neg = 4]
[1][ID = 48][pos = 20][neg = 10]
[2][ID = 47][pos = 10][neg = 5]

Mit array skal sorteres efter 'pos/neg' DESC og pos DESC, nogen kloge som kan hjælpe mig? :)
Avatar billede Daniel.E Praktikant
29. april 2005 - 09:47 #1
prøv at kig her, der  er også kode eksempler :)

http://dk.php.net/sort
Avatar billede bromer Nybegynder
29. april 2005 - 09:47 #2
Det lyder umiddelbart ikke saerlig koent. Henter du ikke data fra en database, for det vil nok vaere vaesentlig lettere at foretage sorteringen deri.
Avatar billede Daniel.E Praktikant
29. april 2005 - 09:48 #3
du skal bare tage alle points selv... samler ikke, giv mig hellere noget karma... hvis du kan bruge mit svar. :)

Håber du finder en løsning
Avatar billede Daniel.E Praktikant
29. april 2005 - 09:49 #4
jo.. kig ned i kommentarende. glemte vidst lige at sige det..  stadigvæk her: http://dk.php.net/sort

:)
Avatar billede jenslyn_s Nybegynder
29. april 2005 - 09:52 #5
vb2, tjekker lige.

Bromer. Jo jeg henter fra en database, men det er en opsamling som ikke kan udføres i én  query, så derfor har jeg samlet op i et array.
Avatar billede Daniel.E Praktikant
29. april 2005 - 09:53 #6
lige for at være på den gode side..

<?php
function multiSortAssocR($input = array(),$priority = array(), $order = 'asc'){

  $priorityKeys = array();
  $ouput = array();
 
  //$input & $priority are array's, otherwise an php error will occur. No need for checking
 
  // make tenporary array with key's and "priority" values that were found in the input array
  // return false on error.
  foreach ($input as $key => $val)
      if(!($priorityKeys[$key] = priorityFind(array($val),$priority))) return false;
     

  // sort the temporatry priorityarray associative, reverse/normal according to $order beeing desc/asc
  if ($order == 'desc') arsort($priorityKeys);
  else asort($priorityKeys);
 
  // everything has been done, now create output array which contains the original values of input array.
  // but now ordened with accoring to "priorityindex"
  foreach ($priorityKeys as $key => $val)
      $output[$key] = $input[$key];
     
  return $output; 
}
 
function priorityFind($input = array(),$priority = array()){
  //$input & $priority are ought to be array's, otherwise a php error will occur
 
  // first, lets get the first key of $priority
  $priorityKey = key($priority);
 
  //check whether we will continue diving into the priority array
  if (!is_array($priority[$priorityKey])) $priorityKey = $priority[$priorityKey];

  // see if we can find the key specified in $priority, in the $input array.
  // if not, just get the first element
  if (array_key_exists($priorityKey,$input)) $inputKey = $priorityKey;
  else $inputKey = key($input);
 
  // diving deeper into $priority and $input, let's just repeat this function till eternity and beyond (or when one of the arrays runs out)
  if (is_array($priority[$priorityKey]))
      return priorityFind($input[$inputKey],$priority[$priorityKey]);     
  else
      return $input[$inputKey];

}
?>

a usage example:

<?php
$input = array(    "foo" => array(
                              "abc" => array('123'),
                              "pri" => array('456'),
                              "4"
                          ),
              "bar" => array(
                              array('123'),
                              "pri" => array('1'),
                              "abc"
                          )
              );
             
$prior = array(''=>array('pri'=>array('')));

$blaat = multiSortAssocR($input,$prior);
echo print_r($blaat);
?>

and it's output:

Array
(
  [bar] => Array
      (
          [0] => Array
              (
                  [0] => 123
              )

          [pri] => Array
              (
                  [0] => 1
              )

          [1] => abc
      )

  [foo] => Array
      (
          [abc] => Array
              (
                  [0] => 123
              )

          [pri] => Array
              (
                  [0] => 456
              )

          [0] => 4
      )

)
Avatar billede Daniel.E Praktikant
29. april 2005 - 09:53 #7
det var denne som jeg mente :)
Avatar billede bromer Nybegynder
29. april 2005 - 09:54 #8
vb2: Saa vidt jeg kan see angives det ikke hvordan man ved sort laver den mest betydende sortering, da det jo er en division af to elementer i arrayet.
Avatar billede Daniel.E Praktikant
29. april 2005 - 09:56 #9
jeg har ikke kigget direkte ned i koden... der står multidimentinal sort...

function multiSortAssocR($input = array(),$priority = array(), $order = 'asc'){
Avatar billede bromer Nybegynder
29. april 2005 - 10:21 #10
Okay, men ligger vel lidt under antagelsen at man kun vil sortere efter kolonner i arrayet,
hvilket også er helt normalt. Men hvis du ser på det array og kode spørgsmålet blev oprettet
med:

$array[] = array(
                "ID" => $val,
                "pos" => $pos,
                "neg" => $neg
                );
eks. på indhold:
[0][ID = 50][pos = 16][neg = 4]
[1][ID = 48][pos = 20][neg = 10]
[2][ID = 47][pos = 10][neg = 5]

Det kan du jo ikke umiddelbart sortere. Derfor giver det nok god mening først at køre
arrayet igennem en transformation der opretter en ratio-del, som man derefter kan sortere
efter.
Avatar billede jenslyn_s Nybegynder
29. april 2005 - 10:56 #11
Altså en 'average' hvor værdien er (pos/neg)?
Avatar billede jenslyn_s Nybegynder
29. april 2005 - 11:15 #12
mente self. ikke average... men den kalkulerede værdi,
Avatar billede bromer Nybegynder
29. april 2005 - 12:04 #13
Hvad mener du?
Avatar billede jenslyn_s Nybegynder
29. april 2005 - 13:36 #14
quote: "Derfor giver det nok god mening først at køre
arrayet igennem en transformation der opretter en ratio-del, som man derefter kan sortere efter."

ratio-->

[0][ID = 50][pos = 16][neg = 4][ratio = (pos/neg)]
Avatar billede jenslyn_s Nybegynder
12. maj 2005 - 21:21 #15
Ingen kunne åbenbart svare.
Avatar billede flushout Nybegynder
05. januar 2006 - 10:28 #16
Bedre sent end aldrig.. her er en løsning =)

$arr er dit array.
$key er den $key du vil sortere på, f.eks. 'ID'.
$order er ASC eller DESC afhængigt af hvilken retning du vil sortere efter.

function sortArray($arr,$key,$order)
{
    if ($order == 'ASC'){
        if (is_numeric($arr[0][$key])) { $compare = create_function('$a,$b','return 1*$a["'.$key.'"]-1*$b["'.$key.'"];'); }
        else { $compare = create_function('$a,$b','return strcasecmp($a["'.$key.'"],$b["'.$key.'"]);'); }
    }
    if($order == 'DESC') {
        if (is_numeric($arr[0][$key])) { $compare = create_function('$a,$b','return 1*$b["'.$key.'"]-1*$a["'.$key.'"];'); }
      else { $compare = create_function('$a,$b','return strcasecmp($b["'.$key.'"],$a["'.$key.'"]);'); }
    }
    if(is_array($arr)){
        usort($arr,$compare);
    }
    return $arr;
}
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