[PHP] Twee dimensionale array sorteren.

Pagina: 1
Acties:

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
Stel ik heb een array als volgt:

$array[0][1] = "b";
$array[1][1] = "d";
$array[2][1] = "c";
$array[3][1] = "e";
$array[4][1] = "a";
$array[0][2] = "1";
$array[1][2] = "2";
$array[2][2] = "3";
$array[3][2] = "4";
$array[4][2] = "5";

nu wil ik deze array sorteren op $array[index][1].
Het tweede deel van $array, met als waarde 1

Mijn echte $array bestaat uit $array[o .. ][0 .. 16] = " een string";
Maar om het simpel te houden is hij nu: $array[0 .. 4][1 .. 2]

$array[0 .. ][1] geeft bijvoorbeeld het merk van een product, en ik wil nu op naam van producten sorteren.
$array[0 .. ][2] geeft bijvoorbeeld de prijs. Als ik 2 meegeef als argument moet er dus op prijs gesorteerd worden.

Ik heb het geprobeerd met een 1-dimensionale array erbij die de waarde van $array[0 .. ][1] tussen de [] heeft en als waarde de eerste index waarde van de 2-dimensionale array.

Maar ik krijg het niet voor elkaar om dit systeem makkelijk uitbreidbaar te maken.

Kan iemand me helpen?

Ik blijf er iig vrij nuchter onder....


  • chem
  • Registratie: Oktober 2000
  • Laatst online: 27-08 13:53

chem

Reist de wereld rond

kijk eens naar ksort() en de links die daar worden gegeven... usort etc.

Klaar voor een nieuwe uitdaging.


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
Ik heb nu de volgende functies gebruikt om mijn array te sorteren:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function arfsort( $a, $fl )
{
 $GLOBALS['__ARFSORT_LIST__'] = $fl;
  usort( $a, 'arfsort_func' );
  return $a;
}

function arfsort_func( $a, $b )
{
  foreach( $GLOBALS['__ARFSORT_LIST__'] as $f )
  {
    $strc = strcmp( $a[$f], $b[$f] );
    if ( $strc != 0 )
    {
    return $strc;
    }
  }
  return 0;
}

$array = arfsort( $array, array(1));

Ik zit nu alleen met het probleem dat als de array op plaats $array[idx][1] geen waarde bevat, dat hij dan als eerste in de gesorteerde lijst komt te staan, ipv onderaan.

Ik snap ook niet precies hoe de bovenstaande functies nou hun werk doen. Misschien iemand die weet hoe ik de lege arrays naar beneden kan sturen?

Ik blijf er iig vrij nuchter onder....


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 17-08 15:34
hmm, ik heb het al opgelost met een simpel truukje:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function arfsort( $a, $fl )
{
 $GLOBALS['__ARFSORT_LIST__'] = $fl;
  usort( $a, 'arfsort_func' );
  return $a;
}

function arfsort_func( $a, $b )
{
  foreach( $GLOBALS['__ARFSORT_LIST__'] as $f )
  {
    if(empty($a[$f])) { $a[$f] = "zzzzzz"; }
    if(empty($b[$f])) { $b[$f] = "zzzzz"; }
    $strc = strcmp( $a[$f], $b[$f] );
    if ( $strc != 0 )
    {
    return $strc;
    }
  }
  return 0;
}

$array = arfsort( $array, array(1));

als iemand weet hoe het mooier kan

Ik blijf er iig vrij nuchter onder....


  • Belgar
  • Registratie: Januari 2002
  • Laatst online: 17-08 22:31

Belgar

Archmaster ranzige code..

return 1 :)

De waarde die je returned geeft aan waar het item moet komen in de lijst. als je steeds return 1 (of return 100) geeft verdwijnt de waarde vanzelf helemaal naar beneden. Wel moet je dan zorgen dat als beide waarden 'empty' zijn dat je 0 terug geeft, anders kom je in een 'eternal loop' wat betreft de sortering.

pseudo:

if a=empty && b=empty
return 0
endif
if a=empty || b=empty
return 1
endif

zoiets

[edit] typo

[edit 2]
dit is natuurlijk onzin |:(

hij moet zo:

if a=empty && b=empty
return 0
endif
if a=empty
return 1
endif
if b=empty
return -1
endif

andersom kan mischien ook... ff omdraaien dan :)

[/edit2]

...Als het maar werkt