3 dim array sorting
Ik ben een newbe.
Ik heb een array die ik wil sorteren op [date] en ik kom er niet uit. Iemand een suggestie waar ik moet beginnen?
ik kom niet op de goede diepte in de array.
Array
(
[0] => Array
(
[0] => Array
(
[title] => titiltje
[date] => 5-6-2010
)
[1] => Array
(
[title] => titiltje2
[date] => 2-6-2010
)
)
[1] => Array
(
[0] => Array
(
[title] => titiltje 5
[date] => 3-6-2010
)
[1] => Array
(
[title] => titiltje2
[date] => 2-6-2010
)
)
)
Als iemand tips heeft waar te starten, graag!
Wouter
Code (php)
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
28
29
30
31
32
33
34
35
36
37
38
39
40
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
28
29
30
31
32
33
34
35
36
37
38
39
40
<?php
$a = array (
array (
array (
'title' => 'hoi' ,
'date' => '5-6-2010'
) ,
array (
'title' => 'hoi' ,
'date' => '5-6-2010'
)
) ,
array (
array (
'title' => 'hoi' ,
'date' => '5-6-2010'
) ,
array (
'title' => 'hoi' ,
'date' => '5-6-2010'
)
)
);
function sorteer ( $a )
{
$a = sort ( $a );
foreach ( $a as $a2 )
{
if ( is_array ( $a2 ) )
{
sorteer ( $a );
}
}
}
$a = sorteer ( $a );
echo '<pre>' , print_r ( $a , true ) , '</pre>';
?>
$a = array (
array (
array (
'title' => 'hoi' ,
'date' => '5-6-2010'
) ,
array (
'title' => 'hoi' ,
'date' => '5-6-2010'
)
) ,
array (
array (
'title' => 'hoi' ,
'date' => '5-6-2010'
) ,
array (
'title' => 'hoi' ,
'date' => '5-6-2010'
)
)
);
function sorteer ( $a )
{
$a = sort ( $a );
foreach ( $a as $a2 )
{
if ( is_array ( $a2 ) )
{
sorteer ( $a );
}
}
}
$a = sorteer ( $a );
echo '<pre>' , print_r ( $a , true ) , '</pre>';
?>
ah, dank! ik ga straks of igg het weekend effe prutsen! Dank!
http://nl2.php.net/manual/en/function.array-multisort.php
Lijkt mij een betere oplossing dan z'n zelf geschreven recursieve functie.
Lijkt mij een betere oplossing dan z'n zelf geschreven recursieve functie.
Als je dit sorteert:
'date' => '15-6-2010'
'date' => '5-6-2010'
'date' => '2-2-2000'
Krijg je dit:
'date' => '15-6-2010'
'date' => '2-2-2000'
'date' => '5-6-2010'
Maak er eerst eens een 'echte' datum van.
Dus YYYY-MM-DD format.
Code (php)
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php
$blaat = array(
array(
array( 'title' => 'titiltje',
'date' => '5-6-2010'
),
array( 'title' => 'titiltje2',
'date' => '2-6-2010'
)
),
array(
array( 'title' => 'titiltje 5',
'date' => '3-6-2010'
),
array( 'title' => 'titiltje2',
'date' => '2-6-2010'
)
)
);
var_dump($blaat);
/* Levert:
array(2) {
[0]=>
array(2) {
[0]=>
array(2) {
["title"]=>
string(8) "titiltje"
["date"]=>
string(8) "5-6-2010"
}
[1]=>
array(2) {
["title"]=>
string(9) "titiltje2"
["date"]=>
string(8) "2-6-2010"
}
}
[1]=>
array(2) {
[0]=>
array(2) {
["title"]=>
string(10) "titiltje 5"
["date"]=>
string(8) "3-6-2010"
}
[1]=>
array(2) {
["title"]=>
string(9) "titiltje2"
["date"]=>
string(8) "2-6-2010"
}
}
}
*/
?>
$blaat = array(
array(
array( 'title' => 'titiltje',
'date' => '5-6-2010'
),
array( 'title' => 'titiltje2',
'date' => '2-6-2010'
)
),
array(
array( 'title' => 'titiltje 5',
'date' => '3-6-2010'
),
array( 'title' => 'titiltje2',
'date' => '2-6-2010'
)
)
);
var_dump($blaat);
/* Levert:
array(2) {
[0]=>
array(2) {
[0]=>
array(2) {
["title"]=>
string(8) "titiltje"
["date"]=>
string(8) "5-6-2010"
}
[1]=>
array(2) {
["title"]=>
string(9) "titiltje2"
["date"]=>
string(8) "2-6-2010"
}
}
[1]=>
array(2) {
[0]=>
array(2) {
["title"]=>
string(10) "titiltje 5"
["date"]=>
string(8) "3-6-2010"
}
[1]=>
array(2) {
["title"]=>
string(9) "titiltje2"
["date"]=>
string(8) "2-6-2010"
}
}
}
*/
?>
Hoe moet het dan gesorteerd worden? Dat kan op verschillende manieren:
titiltje2
titiltje 5
titiltje2
titiltje
titiltje2
titiltje2
titiltje 5
titiltje
titiltje2
titiltje 5
titiltje
De ene bewaard dus wel de structuur van de 'omliggende' array, de andere niet, en de derde haalt ook eens het duplicaat weg. Wat wil je nu? Misschien is het ook eerst handig om een handigere array te maken. Waar komt dit überhaupt uit?
(@SanThe: Met natsort gaat het wel goed:
Code (php)
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
28
29
30
31
32
33
34
35
36
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
28
29
30
31
32
33
34
35
36
<?php
$a = array ('15-6-2010', '3-6-2010', '5-6-2010', '2-6-2010', '2-2-2000', '2-6-2010');
$b = $a;
natsort($a);
var_dump($a, $b);
/* Levert:
array(6) {
[4]=>
string(8) "2-2-2000"
[5]=>
string(8) "2-6-2010"
[3]=>
string(8) "2-6-2010"
[1]=>
string(8) "3-6-2010"
[2]=>
string(8) "5-6-2010"
[0]=>
string(9) "15-6-2010"
}
array(6) {
[0]=>
string(9) "15-6-2010"
[1]=>
string(8) "3-6-2010"
[2]=>
string(8) "5-6-2010"
[3]=>
string(8) "2-6-2010"
[4]=>
string(8) "2-2-2000"
[5]=>
string(8) "2-6-2010"
}
*/
?>
$a = array ('15-6-2010', '3-6-2010', '5-6-2010', '2-6-2010', '2-2-2000', '2-6-2010');
$b = $a;
natsort($a);
var_dump($a, $b);
/* Levert:
array(6) {
[4]=>
string(8) "2-2-2000"
[5]=>
string(8) "2-6-2010"
[3]=>
string(8) "2-6-2010"
[1]=>
string(8) "3-6-2010"
[2]=>
string(8) "5-6-2010"
[0]=>
string(9) "15-6-2010"
}
array(6) {
[0]=>
string(9) "15-6-2010"
[1]=>
string(8) "3-6-2010"
[2]=>
string(8) "5-6-2010"
[3]=>
string(8) "2-6-2010"
[4]=>
string(8) "2-2-2000"
[5]=>
string(8) "2-6-2010"
}
*/
?>
Maar deze niet:
Code (php)
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
28
29
30
31
32
33
34
35
36
37
38
39
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
28
29
30
31
32
33
34
35
36
37
38
39
<?php
$a = array ('15-6-2010', '3-6-2010', '5-6-2010', '2-6-2010', '2-2-2000', '3-6-2005');
$b = $a;
natsort($a);
echo '<pre>';
var_dump($a, $b);
echo '</pre>';
/* Output
array(6) {
[4]=>
string(8) "2-2-2000"
[3]=>
string(8) "2-6-2010"
[5]=>
string(8) "3-6-2005"
[1]=>
string(8) "3-6-2010"
[2]=>
string(8) "5-6-2010"
[0]=>
string(9) "15-6-2010"
}
array(6) {
[0]=>
string(9) "15-6-2010"
[1]=>
string(8) "3-6-2010"
[2]=>
string(8) "5-6-2010"
[3]=>
string(8) "2-6-2010"
[4]=>
string(8) "2-2-2000"
[5]=>
string(8) "3-6-2005"
}
*/
?>
$a = array ('15-6-2010', '3-6-2010', '5-6-2010', '2-6-2010', '2-2-2000', '3-6-2005');
$b = $a;
natsort($a);
echo '<pre>';
var_dump($a, $b);
echo '</pre>';
/* Output
array(6) {
[4]=>
string(8) "2-2-2000"
[3]=>
string(8) "2-6-2010"
[5]=>
string(8) "3-6-2005"
[1]=>
string(8) "3-6-2010"
[2]=>
string(8) "5-6-2010"
[0]=>
string(9) "15-6-2010"
}
array(6) {
[0]=>
string(9) "15-6-2010"
[1]=>
string(8) "3-6-2010"
[2]=>
string(8) "5-6-2010"
[3]=>
string(8) "2-6-2010"
[4]=>
string(8) "2-2-2000"
[5]=>
string(8) "3-6-2005"
}
*/
?>
Maar inderdaad, sowieso slimmer om met het juiste formaat te werken.
bron is een loop van verschillende RSS feeds die moeten worden samengevoegd en dan op datum gesorteerd.
ik ga ermee aan het werk! Dank
Wwwouter Tinbergen op 06/06/2010 11:46:00:
Dank voor jullie reacties. Heb pas woensdag tijd. Probleem (voor mij) van geneste arrays komt door Array-push. Ik zal kijken of ik dat kan wijzigen.
bron is een loop van verschillende RSS feeds die moeten worden samengevoegd en dan op datum gesorteerd.
ik ga ermee aan het werk! Dank
bron is een loop van verschillende RSS feeds die moeten worden samengevoegd en dan op datum gesorteerd.
ik ga ermee aan het werk! Dank
Ik had al zo'n vermoeden dat het dus van meerdere plekken samengevoegd werdt. Volgens mij moet je het dan in principe ook zo kunnen maken dat de buitenste twee arrays vervallen, want nu hebben ze geen toegevoegde waarde (in jou voorbeeld).
Ter info : alles zit nu netjes in 1 array met een array_merge. Ga nu de datum omschrijven en dan sorteren op datum.