Tabel / vierkantsarray
Een reeks records die als regels/rijen worden gepresenteerd.
Een tabel dus, niet te verwarren met een MySql table.
Nu vind ik een hoop array functies en array sorteerfuncties.
Maar die mijn tabel kan sorteren op een aangegeven kolom vind ik niet.
Ik kan me niet voorstellen dat die functie niet al bestaat in PHP.
Kent iemand die?
Voorlopig heb ik het als volgt opgelost.
1. voeg voor elk record/array/rij het aangewezen veld vooraan in.
2. sorteer (Gelukkig sorteert sort ook een array van arrays)
3. verwijder het voorste veld weer.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function sortArrayTabel($aIn, $kolNr = 0) {
foreach ($aIn as $aRegel) {
$aTmp = array();
$aTmp[] = $aRegel[$kolNr];
$aRegel = array_merge($aTmp, $aRegel);
$aUit[] = $aRegel;
}
$aIn = $aUit;
sort($aIn);
$aUit = array();
foreach ($aIn as $aRegel) {
$tmp = array_shift($aRegel);
$aUit[] = $aRegel;
}
return $aUit;
}
foreach ($aIn as $aRegel) {
$aTmp = array();
$aTmp[] = $aRegel[$kolNr];
$aRegel = array_merge($aTmp, $aRegel);
$aUit[] = $aRegel;
}
$aIn = $aUit;
sort($aIn);
$aUit = array();
foreach ($aIn as $aRegel) {
$tmp = array_shift($aRegel);
$aUit[] = $aRegel;
}
return $aUit;
}
Nogal omslachtig, als zeg ik het zelf...
De aanroep is eenvoudiger
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
$aS[] = array('5', '2', '6', '1');
$aS[] = array('3', '4', '1', '2');
$aS[] = array('8', '1', '5', '3');
$kolomNummer=1; // vanaf 0
printArrayTabel($aS);
$aR=sortArrayTabel($aS, $kolomNummer);
printArrayTabel($aR);
$aS[] = array('3', '4', '1', '2');
$aS[] = array('8', '1', '5', '3');
$kolomNummer=1; // vanaf 0
printArrayTabel($aS);
$aR=sortArrayTabel($aS, $kolomNummer);
printArrayTabel($aR);
De uitvoer ter referentie
5 2 6 1
3 4 1 2
8 1 5 3
8 1 5 3
5 2 6 1
3 4 1 2
De vraag is dus: kan dit niet met één PHP functie?
Gewijzigd op 01/10/2016 16:05:01 door Paul Ulje
Waarom doe je het sorteren niet direct in je MySQL query?
Iets meer:
Stel er is een object PEER. Die wordt gewaardeerd door een willekeurig aantal mensen met een cijfer 1..10. Dat staat in de DB.
Daaruit bereken we het gemiddelde, de deviatie, de variatie, aantal.
Dan komt er een tabel:
O G D V A
peer x x x x
etc.
Om nu vlot deze bewerkte gegevens te kunnen bekijken wil ik de tabel gesorteerd op de verschillende kolommen bekijken. Zonder telkens het hele proces opnieuw te doorlopen.
Gewijzigd op 01/10/2016 17:17:04 door Paul Ulje
Hier opnieuw
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
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
<?php
$aS[] = array('5', '2', '6', '1');
$aS[] = array('3', '4', '1', '2');
$aS[] = array('8', '1', '5', '3');
echo '<pre>';
print_r($aS);
echo '</pre>';
foreach ($aS as $key => $value) {
foreach ($value as $k => $v) {
echo $v . ' ';
}
echo '<br />';
}
// Obtain a list of columns
foreach ($aS as $key => $row) {
$r4[$key] = $row[0];
$r3[$key] = $row[1];
$r2[$key] = $row[2];
$r1[$key] = $row[3];
}
// Sort the data with volume descending, edition ascending
// Add $data as the last parameter, to sort by the common key
//array_multisort($r7, SORT_DESC, $r6, SORT_ASC, $multicol);
array_multisort(
$r4, SORT_DESC,
$r3, SORT_DESC,
$r2, SORT_DESC,
$r1, SORT_DESC,
$aS
);
echo '<pre>';
print_r($aS);
echo '</pre>';
foreach ($aS as $key => $value) {
foreach ($value as $k => $v) {
echo $v . ' ';
}
echo '<br />';
}
?>
$aS[] = array('5', '2', '6', '1');
$aS[] = array('3', '4', '1', '2');
$aS[] = array('8', '1', '5', '3');
echo '<pre>';
print_r($aS);
echo '</pre>';
foreach ($aS as $key => $value) {
foreach ($value as $k => $v) {
echo $v . ' ';
}
echo '<br />';
}
// Obtain a list of columns
foreach ($aS as $key => $row) {
$r4[$key] = $row[0];
$r3[$key] = $row[1];
$r2[$key] = $row[2];
$r1[$key] = $row[3];
}
// Sort the data with volume descending, edition ascending
// Add $data as the last parameter, to sort by the common key
//array_multisort($r7, SORT_DESC, $r6, SORT_ASC, $multicol);
array_multisort(
$r4, SORT_DESC,
$r3, SORT_DESC,
$r2, SORT_DESC,
$r1, SORT_DESC,
$aS
);
echo '<pre>';
print_r($aS);
echo '</pre>';
foreach ($aS as $key => $value) {
foreach ($value as $k => $v) {
echo $v . ' ';
}
echo '<br />';
}
?>
Toevoeging op 01/10/2016 17:22:53:
Hier eenzelfde soort vraagstuk :
https://www.phphulp.nl/php/forum/topic/array-sorteren-zoals-in-mysql/100317/
En hier voor de goede orde de uitwerking :
http://adoptive.esy.es/multisort/
Dank! Als beginner lukt het me niet zo snel deze code te doorgronden. Begrijp ik het goed dat de procedure/functie array_multisort de oplossing biedt? Ik ga het bestuderen.