/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
sortere data i array
Fra : scootergrisen


Dato : 12-09-10 13:07

Jeg vil gerne sortere dette :

'test' => array(
array('x', 'x', 'g')
,array('x', 'x', 'h')
,array('x', 'x', 'v')
,array('x', 'x', 'w')
,array('x', 'x', 't')
,array('x', 'x', 'a')
,array('x', 'x', 'h')
,array('x', 'x', 'e')
,array('x', 'x', 'a')
,array('x', 'x', 'x')
)

så det bliver til dette :

'test' => array(
array('x', 'x', 'a')
,array('x', 'x', 'a')
,array('x', 'x', 'e')
,array('x', 'x', 'g')
,array('x', 'x', 'h')
,array('x', 'x', 'h')
,array('x', 'x', 't')
,array('x', 'x', 'v')
,array('x', 'x', 'w')
,array('x', 'x', 'x')
)

Hvordan gør man det ?

 
 
Martin (12-09-2010)
Kommentar
Fra : Martin


Dato : 12-09-10 23:16

On 12-09-2010 21:06, scootergrisen wrote:
> Jeg vil gerne sortere dette :
>
> 'test' => array(
> array('x', 'x', 'g')
> ,array('x', 'x', 'h')
> ,array('x', 'x', 'v')
> ,array('x', 'x', 'w')
> ,array('x', 'x', 't')
> ,array('x', 'x', 'a')
> ,array('x', 'x', 'h')
> ,array('x', 'x', 'e')
> ,array('x', 'x', 'a')
> ,array('x', 'x', 'x')
> )
>
> så det bliver til dette :
>
> 'test' => array(
> array('x', 'x', 'a')
> ,array('x', 'x', 'a')
> ,array('x', 'x', 'e')
> ,array('x', 'x', 'g')
> ,array('x', 'x', 'h')
> ,array('x', 'x', 'h')
> ,array('x', 'x', 't')
> ,array('x', 'x', 'v')
> ,array('x', 'x', 'w')
> ,array('x', 'x', 'x')
> )
>
> Hvordan gør man det ?

Hvis dine arrays altid ser sådan ud, så kan du bruge multisort


array_multisort($test[0], SORT_ASC, SORT_STRING,
$test[1], SORT_ASC, SORT_STRING,
      $test[2], SORT_ASC, SORT_STRING
);

http://se.php.net/array_multisort

scootergrisen (12-09-2010)
Kommentar
Fra : scootergrisen


Dato : 12-09-10 20:10

Hvor angiver man hvilket felt man ønsker at sortere efter ?

Her er et andet eksempel.

Dette :

'test' => array(
array('telefon', 'bip', 'g')
,array('ko', 'muh', 'a')
,array('mis', 'miau', 'x')
,array('bil', 'dut', 'h')
)

Skal blive til dette :

'test' => array(
array('ko', 'muh', 'a')
,array('telefon', 'bip', 'g')
,array('bil', 'dut', 'h')
,array('mis', 'miau', 'x')
)

Der skal sorteres efter det sidste felt i hvert array 'a', 'g', 'h' og
'x'.

Martin (13-09-2010)
Kommentar
Fra : Martin


Dato : 13-09-10 11:39

On 13-09-2010 04:10, scootergrisen wrote:
> Hvor angiver man hvilket felt man ønsker at sortere efter ?
>
> Her er et andet eksempel.
>
> Dette :
>
> 'test' => array(
> array('telefon', 'bip', 'g')
> ,array('ko', 'muh', 'a')
> ,array('mis', 'miau', 'x')
> ,array('bil', 'dut', 'h')
> )

Dit array ser således ud

$test[0][0][0] = Telefon
$test[0][0][1] = bip
$test[0][0][2] = g

$test[0][1][0] = ko
$test[0][1][1] = muh
$test[0][1][2] = a

$test[0][2][0] = mis
$test[0][2][1] = miay
$test[0][2][2] = x

$test[0][3][0] = bil
$test[0][3][1] = dut
$test[0][3][2] = h

array_multisort($test[0][0], SORT_ASC, SORT_STRING,
$test[0][1], SORT_ASC, SORT_STRING,
      $test[0][2], SORT_ASC, SORT_STRING,
      $test[0][3], SORT_ASC, SORT_STRING
);



>
> Skal blive til dette :
>
> 'test' => array(
> array('ko', 'muh', 'a')
> ,array('telefon', 'bip', 'g')
> ,array('bil', 'dut', 'h')
> ,array('mis', 'miau', 'x')
> )
>
> Der skal sorteres efter det sidste felt i hvert array 'a', 'g', 'h' og
> 'x'.


Ronny Olsen (13-09-2010)
Kommentar
Fra : Ronny Olsen


Dato : 13-09-10 12:54

Den 13-09-2010 04:10, scootergrisen skrev:
> Hvor angiver man hvilket felt man ønsker at sortere efter ?
>
> Her er et andet eksempel.
>
> Dette :
>
> 'test' => array(
> array('telefon', 'bip', 'g')
> ,array('ko', 'muh', 'a')
> ,array('mis', 'miau', 'x')
> ,array('bil', 'dut', 'h')
> )
>
> Skal blive til dette :
>
> 'test' => array(
> array('ko', 'muh', 'a')
> ,array('telefon', 'bip', 'g')
> ,array('bil', 'dut', 'h')
> ,array('mis', 'miau', 'x')
> )
>
> Der skal sorteres efter det sidste felt i hvert array 'a', 'g', 'h' og
> 'x'.

Som Martin skriver skal vi have fat i array_multisort, jeg vil vælge at
opdele det i kolonner først og sorterer det efter disse

<?php
/*
$test = array(
      array('telefon', 'bip', 'g'),
      array('ko', 'muh', 'a'),
      array('mis', 'miau', 'x'),
      array('bil', 'dut', 'h')
);
*/

$test = array(
   array('x', 'x', 'g'),
   array('x', 'x', 'h'),
   array('x', 'x', 'v'),
   array('x', 'x', 'w'),
   array('x', 'x', 't'),
   array('x', 'x', 'a'),
   array('x', 'x', 'h'),
   array('x', 'x', 'e'),
   array('x', 'x', 'a'),
   array('x', 'x', 'x')
);



function SortMultiArray(&$data){

// http://dk.php.net/array_multisort Example #3 Sorting database results
   // Obtain a list of columns
   foreach ($data as $key => $row) {
      $col0[$key] = $row[0];
      $col1[$key] = $row[1];
      $col2[$key] = $row[2];
   }
   // Sort the data with volume descending, edition ascending
   // Add $data as the last parameter, to sort by the common key
   array_multisort($col2, SORT_ASC, $data);
}


print_r($test);
SortMultiArray($test);
print_r($test);

?>

--
Med Venlig Hilsen
Ronny Olsen
http://olsensweb.dk

Henning (13-09-2010)
Kommentar
Fra : Henning


Dato : 13-09-10 13:08

On 2010-09-12 21:06, scootergrisen wrote:
> Jeg vil gerne sortere dette :
>
> 'test' => array(
> array('x', 'x', 'g')
> ,array('x', 'x', 'h')
> ,array('x', 'x', 'v')
> ,array('x', 'x', 'w')
> ,array('x', 'x', 't')
> ,array('x', 'x', 'a')
> ,array('x', 'x', 'h')
> ,array('x', 'x', 'e')
> ,array('x', 'x', 'a')
> ,array('x', 'x', 'x')
> )
>
> så det bliver til dette :
>
> 'test' => array(
> array('x', 'x', 'a')
> ,array('x', 'x', 'a')
> ,array('x', 'x', 'e')
> ,array('x', 'x', 'g')
> ,array('x', 'x', 'h')
> ,array('x', 'x', 'h')
> ,array('x', 'x', 't')
> ,array('x', 'x', 'v')
> ,array('x', 'x', 'w')
> ,array('x', 'x', 'x')
> )
>
> Hvordan gør man det ?

Der er kommet en masse løsninger, men hvorfor ikke bare bruge uasort ?

   function cmp($a, $b) {
    if ($a[2] == $b[2]) {
    return 0;
    }
    return ($a[2] < $b[2]) ? -1 : 1;
   }

   uasort($array, 'cmp');

kode er klippet næsten direkte fra
http://dk.php.net/manual/en/function.uasort.php

Eneste ændring er at den checker på $a[2] i stedet for $a, hhv $b

/Henning

scootergrisen (13-09-2010)
Kommentar
Fra : scootergrisen


Dato : 13-09-10 07:51

Tak til allesammen. Det ser ud til at virke som jeg vil have det nu.
Og jeg læste mig frem til hvordan man lavede det case-insensitive.
Det eneste der ikke virker er æ, ø, å men det jo typisk.

Der er nogen grund til der står &$data og ikke $data i funktionens
argument ?

function SortMultiArray(&$data){

Hvad betyder det & ?

Henning (13-09-2010)
Kommentar
Fra : Henning


Dato : 13-09-10 15:17

On 2010-09-13 15:51, scootergrisen wrote:
> Der er nogen grund til der står &$data og ikke $data i funktionens
> argument ?
>
> function SortMultiArray(&$data){
>
> Hvad betyder det & ?

& gør at der overføres en pointer til de originale data, ikke en kpi af
dine data.

   <?php
   function a($local) {
      $local++;
      echo "local er nu $local";
   }

   function b(&$local) {
      $local++;
      echo "local er nu $local";
   }

   $test = 1;

   echo "test er nu $test<br>";
   a($test);
   echo "test er nu $test<br>";
   b($test);
   echo "test er nu $test<br>";
   ?>

vil give:
   test er nu 1
   local er nu 2
   test er nu 1
   local er nu 2
   test er nu 2

/Henning

scootergrisen (13-09-2010)
Kommentar
Fra : scootergrisen


Dato : 13-09-10 08:49

Ok tak.

Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409073
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste