[php] sorten 2-dimensionale array

Pagina: 1
Acties:
  • 102 views sinds 30-01-2008
  • Reageer

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 08-09 17:10
Sorry dat de vraag in het engels is, maar zo stelde ik um op IRC.. daar hadden ze er alleen geen antwoord op ;)

I have an 2-dimentional array, $rank[0][0] through $rank[15][7] .... unsorted... I want the array $rank (not $rank[0]) sorted on the value that is in $rank[x][7] ... How do I do that?

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 08-09 17:10
Nog meer uitleg:
PHP:
1
2
3
4
5
6
7
8
9
<?
$rank[0][0] = 'email@host.com';
$rank[0][1] = 'ip';
$rank[0][2] = 'hits weinig';
//
$rank[1][0] = 'bla@bla.com';
$rank[1][1] = 'ander ip';
$rank[1][2] = 'hits veel';
?>

Ik wil dit dus sorten op $rank[x][2], zodat het volgende resultaat ontstaat:
PHP:
1
2
3
4
5
6
7
8
9
<?
$rank[1][0] = 'email@host.com';
$rank[1][1] = 'ip';
$rank[1][2] = 'hits weinig';
//
$rank[0][0] = 'bla@bla.com';
$rank[0][1] = 'ander ip';
$rank[0][2] = 'hits veel';
?>

Maar hoe? ;)

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 08-09 17:10
Op Sunday 28 October 2001 22:06 schreef marcusk het volgende:
http://php.nederland.net/manual/en/function.array-multisort.php
Ah... Ik was druk aan het tikken met nadere uitleg.. :) Ik zal ff kijken ;)

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
code:
1
2
3
4
5
6
list ($result[2], $result[0], $result[1]) = 
    array_multisort(
      $rank[2], SORT_ASC,
      $rank[0], 
      $rank[1]
    )

denk ik

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 08-09 17:10
Op Sunday 28 October 2001 22:11 schreef marcusk het volgende:
code:
1
2
3
4
5
6
list ($result[2], $result[0], $result[1]) = 
    array_multisort(
      $rank[2], SORT_ASC,
      $rank[0], 
      $rank[1]
    )

denk ik
Dan krijg ik: Warning: Cannot use a scalar value as an array

Verwijderd

sorry voor het boven halen van een oude topic, maar deze had nog steeds geen antwoord?

weet iemand nu wel hoe het moet?

voorbeeld:

$arrVoorbeeld[0]["ID"] = 1;
$arrVoorbeeld[0]["VALUE"] = "Hallo";
$arrVoorbeeld[1]["ID"] = 5;
$arrVoorbeeld[1]["VALUE"] = "Hello";
$arrVoorbeeld[2]["ID"] = 9;
$arrVoorbeeld[2]["VALUE"] = "Allo";

uitkomst moet zijn:

$arrVoorbeeld[x1]["ID"] = 9;
$arrVoorbeeld[x1]["VALUE"] = "Allo";
$arrVoorbeeld[x2]["ID"] = 1;
$arrVoorbeeld[x2]["VALUE"] = "Hallo";
$arrVoorbeeld[x3]["ID"] = 5;
$arrVoorbeeld[x3]["VALUE"] = "Hello";

x = maak mij niet zo veel uit wat voor nummer het is, als het maar oplopent is.

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09-2025

djc

Je moet een usort maken... Zie manual entry bij de functie usort().

http://www.php.net/manual/en/function.usort.php

Rustacean


Verwijderd

Je mag toch hopen dat de topicstarter dit probleem na een half jaar toch niet nog steeds heeft :o Verder meen ik dat hier gister nog een topic over geweest is...

  • Ericston
  • Registratie: Maart 2001
  • Laatst online: 05-09 18:58
[topic=437218/1/25]

Dit is nog niet eens van de pagina af en nu haal je een andere thread uit de ouwe- }:O -sloot...

...search zeker niet gebruikt ofzo?

edit:
Search wel gebruikt natuurlijk, anders had je deze niet kunnen opvissen, mybad. :)

Verwijderd

Op woensdag 13 maart 2002 17:21 schreef Ericston het volgende:
[topic=437218/1/25]

Dit is nog niet eens van de pagina af en nu haal je een andere thread uit de ouwe- }:O -sloot...

...search zeker niet gebruikt ofzo?

edit:
Search wel gebruikt natuurlijk, anders had je deze niet kunnen opvissen, mybad. :)
Search wel gebruikt maar die nieuwe niet gevonden |:(

Tnx Zef moest hem dus wel hebben :( had hem geprobeerd maar kreeg geen uit komst. Bleek dus dat de eerst leeg was AAAAAAAAAG |:(

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

riiiiiiiight
voortaan zoeken gesorteerd op tijd laatste reactie

Doet iets met Cloud (MS/IBM)


  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

heropend op verzoek starter die graag een aanvulling wil doen

Doet iets met Cloud (MS/IBM)


  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 08-09 17:10
Thanx D2k :) Alleen denk ik nu.. Hum TheMAzTER is er al uit. Maar goed.. Een zooi tips (ahum, mijn project-verhaal op het moment).

Ik had
$list[email-adres][0] = hits today
$list[email-adres][1] = hits day-1
$list[email-adres][2] = hits day-2
Dat is niet te sorteren met een array_multisort, omdat email-adres compleet variabel is. Wat je in zo'n geval kan doen is um ombouwen naar zo'n formaat:
$list[0][x] = hits today
$list[1][x] = hits day-1
$list[2][x] = hits day-2
$list[3][x] = email-adres
Daar is wel op te array_multisorten :)
Anti-flame: Dit kan vast ook beter, maar nog geen zin in gehad me daar in te verdiepen.. Post maar wel hoe het wél zou moeten plz

Tweede tip (en dat was gewoon domheid van mij, maar dus)
array_multisort levert geen array terug gesorteerd in de goede volgorde, maar gaat in de originele array frotten. Ik deed:
$list = array_multisort ($list[0], SORT_DESC);
Dát gaat wel aardig, maar daarna wou ik um nog een keer sorten, en kreeg ik de error die TheMAzTER kreeg: Warning: Cannot use a scalar value as an array in general.php on line 68. Ik maar zoeken waar zit ie?!? $list was 1 geworden, omdat array_multisort dát terugstuurt :(


Naja, in de hoop niet voor nix gevraagd hebbend deze opnieuw te openen hoop ik dat mensen hier wat aan hebben.. Zow en nu naar de plee om al die hoop door te spoelen

  • Altaphista
  • Registratie: Juli 2001
  • Laatst online: 17:19

Altaphista

1. check manual, 2. ask

Op de een of andere manier doet die multisort het bij mij niet goed... hij sort alleen een kolom van de array, en de rest neemt ie niet mee.. :?

vb van mijn array:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$myarray[0][0] = '20020501';
$myarray[1][0] = 'tekst01';
$myarray[2][0] = 'email01';

$myarray[0][2] = '20020506';
$myarray[1][2] = 'tekst06';
$myarray[2][2] = 'email06';

$myarray[0][3] = '20020503';
$myarray[1][3] = 'tekst03';
$myarray[2][3] = 'email03';

$myarray[0][1] = '20020502';
$myarray[1][1] = 'tekst02';
$myarray[2][1] = 'email02';

en dan geeft array_multisort het volgende:
code:
1
2
3
4
20020501,tekst01,email01
20020502,tekst02,email02
20020503,tekst06,email06  <------
20020506,tekst03,email03  <------

terwijl er dit moet staan:
code:
1
2
3
4
20020501,tekst01,email01
20020502,tekst02,email02
20020503,tekst03,email03
20020506,tekst06,email06

:? :? :?
iemand oplossing?

Je gaat het pas zien als je het doorhebt.


  • El_BingO
  • Registratie: Juli 2001
  • Laatst online: 26-08 12:01
Altaphista: Hoe roep je het aan?

  • Altaphista
  • Registratie: Juli 2001
  • Laatst online: 17:19

Altaphista

1. check manual, 2. ask

Op donderdag 02 mei 2002 12:35 schreef El_BingO het volgende:
Altaphista: Hoe roep je het aan?
Ik heb al van alles geprobeerd, van sort tot array_multisort met ook (volgens mij) alle mogelijke aanroepen... zal wel niet de juiste aanroep hebben gehad waarschijnlijk...
maar wat is deze dan wel... kan toch niet zo moeilijk zijn? :?

Je gaat het pas zien als je het doorhebt.


  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 08-09 17:10
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$myarray[0][0] = '20020501';
$myarray[0][1] = '20020502';
$myarray[0][2] = '20020506';
$myarray[0][3] = '20020503';

$myarray[1][0] = 'tekst01';
$myarray[1][1] = 'tekst02';
$myarray[1][2] = 'tekst06';
$myarray[1][3] = 'tekst03';

$myarray[2][0] = 'email01';
$myarray[2][1] = 'email02';
$myarray[2][2] = 'email06';
$myarray[2][3] = 'email03';

array_multisort ($myarray[0]);
zou moeten leveren:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$myarray[0][0] = '20020501';
$myarray[0][1] = '20020502';
$myarray[0][2] = '20020503';
$myarray[0][3] = '20020506';

$myarray[1][0] = 'tekst01';
$myarray[1][1] = 'tekst02';
$myarray[1][2] = 'tekst03';
$myarray[1][3] = 'tekst06';

$myarray[2][0] = 'email01';
$myarray[2][1] = 'email02';
$myarray[2][2] = 'email03';
$myarray[2][3] = 'email06';

probeer anders eens array_multisort ($myarray[0], SORT_ASC, SORT_NUMERIC);

  • Altaphista
  • Registratie: Juli 2001
  • Laatst online: 17:19

Altaphista

1. check manual, 2. ask

Op donderdag 02 mei 2002 13:06 schreef elviver het volgende:
[...]
array_multisort ($myarray[0]);
zou moeten leveren:

[...]

probeer anders eens array_multisort ($myarray[0], SORT_ASC, SORT_NUMERIC);
beiden doen het bij mij niet :'( (had ik ook al geprobeerd)

Je gaat het pas zien als je het doorhebt.


  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 08-09 17:10
Ik ga nu eens heel snel kijken of mijn array_multisorts wel goed werken!! :?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Je array ziet er zo uit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Array
(
    [0] => Array
      (
        [0] => 20020501
        [2] => 20020506
        [3] => 20020503
        [1] => 20020502
      )

    [1] => Array
      (
        [0] => tekst01
        [2] => tekst06
        [3] => tekst03
        [1] => tekst02
      )

    [2] => Array
      (
        [0] => email01
        [2] => email06
        [3] => email03
        [1] => email02
      )

)

Volgens mij is dat niet helemaal de goede opbouw voor multisort ?

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 08-09 17:10
Jawel, júíst wel

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Owja?
PHP:
1
<?$myarray = array();$myarray[0][0] = '20020501';$myarray[1][0] = 'tekst01';$myarray[2][0] = 'email01';$myarray[0][2] = '20020506';$myarray[1][2] = 'tekst06';$myarray[2][2] = 'email06';$myarray[0][3] = '20020503';$myarray[1][3] = 'tekst03';$myarray[2][3] = 'email03';$myarray[0][1] = '20020502';$myarray[1][1] = 'tekst02';$myarray[2][1] = 'email02';array_multisort($myarray);print_r($myarray);$myarray = array();$myarray[0][0] = '20020501';$myarray[0][1] = 'tekst01';$myarray[0][2] = 'email01';$myarray[2][0] = '20020506';$myarray[2][1] = 'tekst06';$myarray[2][2] = 'email06';$myarray[3][0] = '20020503';$myarray[3][1] = 'tekst03';$myarray[3][2] = 'email03';$myarray[1][0] = '20020502';$myarray[1][1] = 'tekst02';$myarray[1][2] = 'email02';array_multisort($myarray);print_r($myarray);?>

Die 2e vind ik toch mooier gesorteerd dan de eerste ;)

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 08-09 17:10
Bij mij gaan ze ook verrot als de **** :( :( :(

In me vorige project gingen ze wel goed. De array had wel de vorm zoals aangegeven. Alleen wat ik daar deed was:

array_multisort ($rank[0], $rank[1], $rank[2], $rank[3], $rank[4], $rank[5], $rank[6], $rank[7]);

Misschien moet je álle dimenties aangeven in de array_multisort? Ik kan het helaas nu niet testen (achter een iets te effectieve alleen-poort-80-proxy :'()

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 08-09 17:10
Op donderdag 02 mei 2002 13:06 schreef elviver het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$myarray[0][0] = '20020501';
$myarray[0][1] = '20020502';
$myarray[0][2] = '20020506';
$myarray[0][3] = '20020503';

$myarray[1][0] = 'tekst01';
$myarray[1][1] = 'tekst02';
$myarray[1][2] = 'tekst06';
$myarray[1][3] = 'tekst03';

$myarray[2][0] = 'email01';
$myarray[2][1] = 'email02';
$myarray[2][2] = 'email06';
$myarray[2][3] = 'email03';
Zo zou het origineel er uit moeten zien...

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 08-09 17:10
Heu... Hoe wou je een 2D-array sorten met array_multisort als de array zo'n opbouw heeft:
$array[x][0] = data
Wat wou je dan bij array_multisort invullen?
Dat kan toch alleen als de array er zo uitziet:
$array[0][x] = data
dan kun je array_multisort($array[0]) doen.. Andersom toch niet?

  • Altaphista
  • Registratie: Juli 2001
  • Laatst online: 17:19

Altaphista

1. check manual, 2. ask

ok thanx, ik probeer het.

Wat ACM zei over die Array: wat is nou de juiste opbouw voor een array?
je hebt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    0  1  2  3
---------------
0 | a  b  c  d
1 | e  f  g  h
2 | i  j  k  l

en

    0  1  2
-----------
0 | a  e  i
1 | b  f  j
2 | c  g  k
3 | d  h  k

Hoe roep je de g aan? als je op de eerste manier van ACM vult, is het myarray[1][2], anders is het myarray[2][1] (array is gespiegeld als je hierboven kijkt).
En op de eerste manier gaat het sorteren dus fout??

Je gaat het pas zien als je het doorhebt.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

De uitleg die in de php-manual staat, doet mij denken dat er row-based gesorteerd wordt.
Namelijk net als in SQL de order by werkt.
dus:
[a][b][c][d]
[a][c][d][e]
[a][b][d][e]

levert:
[a][b][c][d]
[a][b][d][e]
[a][c][d][e]
op.

  • Altaphista
  • Registratie: Juli 2001
  • Laatst online: 17:19

Altaphista

1. check manual, 2. ask

ACM: je hebt gelijk.

Zo doet ie het bij mij:
PHP:
1
<?$myarray = array();//while/for lus met $x  $myarray[$x][0] = 'een_datum';  $myarray[$x][1] = 'een_tekst';  $myarray[$x][2] = 'een_email';array_multisort($myarray);?>

Dank 8-)

Je gaat het pas zien als je het doorhebt.


  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 08-09 17:10
Dan ben ik de draad verloren.. Mijn array:

$list[email-adres][0] = units day0
$list[email-adres][1] = units day-1
$list[email-adres][2] = units day-2
$list[email-adres][3] = units day-3

Die wil ik op $list[email-adres][1] sorteren. De array moet dan hetzelfde blijven, behalve de diepste (2D) inhoud..
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$list["bla@email.com"][0] = 18;
$list["bla@email.com"][1] = 33;
$list["bla@email.com"][2] = 5;
$list["bla@email.com"][3] = 17;

$list["dus@host.com"][0] = 17;
$list["dus@host.com"][1] = 50;
$list["dus@host.com"][2] = 31;
$list["dus@host.com"][3] = 32;

$list["ik.snap@het.niet"][0] = 2;
$list["ik.snap@het.niet"][1] = 40;
$list["ik.snap@het.niet"][2] = 47;
$list["ik.snap@het.niet"][3] = 51;

Daar moet dan uitkomen:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$list["dus@host.com"][0] = 17;
$list["dus@host.com"][1] = 50;
$list["dus@host.com"][2] = 31;
$list["dus@host.com"][3] = 32;

$list["ik.snap@het.niet"][0] = 2;
$list["ik.snap@het.niet"][1] = 40;
$list["ik.snap@het.niet"][2] = 47;
$list["ik.snap@het.niet"][3] = 51;

$list["bla@email.com"][0] = 18;
$list["bla@email.com"][1] = 33;
$list["bla@email.com"][2] = 5;
$list["bla@email.com"][3] = 17;

De hele (dus ook alle onderliggende) array $list["bla@email.com"] moet onderaan komen te staan (in een foreach $list as $email => $data).. Dat kán dan toch niet met een array_multisort?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op donderdag 02 mei 2002 14:28 schreef elviver het volgende:

De hele (dus ook alle onderliggende) array $list["bla@email.com"] moet onderaan komen te staan (in een foreach $list as $email => $data).. Dat kán dan toch niet met een array_multisort?
Volgens mij gaat dat goed, maar ik weet niet of je je key's bewaard met array_multisort...

  • DRvDijk
  • Registratie: Juni 2001
  • Laatst online: 08-09 17:10
Welk commando zou ik dan aan moeten roepen? array_multisort ($list[][1]); ?
Sorry, ik kan nu niet testen
Pagina: 1