Maak array van serie komma gescheiden getallen en verwerk
In de database staan regels met een serie getallen als 526,596,549,620,530,600 (soms wel serie van 26).
Als je ze telt 0,1,2,3... zijn alle even getallen X en alle oneven Y.
Ik moet nu de laagste en hoogste waarde van alle Xen en Yen eruit hebben.
Dus in dit geval zijn de Xen: 526,549,530 waarbij de laagste 526 en hoogste 549, en zo met de Yen.
Vragen:
Hoe krijg ik ' ' om de getallen om er een array van te maken zodat ik daar de hoogste en laagste waarde uit kan filteren?
Is natsort($array); de beste manier dit te filteren?
Als je ze telt 0,1,2,3... zijn alle even getallen X en alle oneven Y.
Ik moet nu de laagste en hoogste waarde van alle Xen en Yen eruit hebben.
Dus in dit geval zijn de Xen: 526,549,530 waarbij de laagste 526 en hoogste 549, en zo met de Yen.
Vragen:
Hoe krijg ik ' ' om de getallen om er een array van te maken zodat ik daar de hoogste en laagste waarde uit kan filteren?
Is natsort($array); de beste manier dit te filteren?
Gewijzigd op 20/09/2013 12:56:45 door Harry Hartman
Een string op die manier kan je tot een array verwerken met de functie explode
Maar een veel belangrijkere vraag is natuurlijk waarom je die getallen zo opslaat. En, of je nog de mogelijkheid hebt om dit aan te passen. Dit is namelijk een zeer foute manier. Als je elk getal apart opslaat (in een andere tabel, gelinked aan de records waar ze bij horen), dan kan je het hele probleem gewoon direct in mysql oplossen wat veel sneller en beter is. Kijk eens naar database normalisatie. Ook al kost het wat werk, het is veel, veel beter dan wat je nu aan het doen bent.
Maar een veel belangrijkere vraag is natuurlijk waarom je die getallen zo opslaat. En, of je nog de mogelijkheid hebt om dit aan te passen. Dit is namelijk een zeer foute manier. Als je elk getal apart opslaat (in een andere tabel, gelinked aan de records waar ze bij horen), dan kan je het hele probleem gewoon direct in mysql oplossen wat veel sneller en beter is. Kijk eens naar database normalisatie. Ook al kost het wat werk, het is veel, veel beter dan wat je nu aan het doen bent.
De reeksen zijn de gegevens van map area's met de bijhorende vorm als poly etc. gelinkt aan een image.
Explode is mij bekend maar niet helemaal het antwoord op mijn vraag...
Explode is mij bekend maar niet helemaal het antwoord op mijn vraag...
Okay, dus uit je database krijg je
$row['getallen'] = '526,596,549,620,530,600';
Dan doe je dit:
- Nu wil je dus $getallen splitsn in even en oneven getallen (en steken in $x en $y), juist?
- Uit $x en $y de min en max weghalen.
Dan eindig je dus met een array $x en een array $y.
Juist?
O ja ... is het van belang dat de volgorde van de array de zelfde blijft?
-----------------
Zo?
$row['getallen'] = '526,596,549,620,530,600';
Dan doe je dit:
Code (php)
1
2
3
4
2
3
4
<?php
$row['getallen'] = '526,596,549,620,530,600'; // komt uit de while($row = fetch...
$getallen = explode(',', $row['getallen']);
?>
$row['getallen'] = '526,596,549,620,530,600'; // komt uit de while($row = fetch...
$getallen = explode(',', $row['getallen']);
?>
- Nu wil je dus $getallen splitsn in even en oneven getallen (en steken in $x en $y), juist?
- Uit $x en $y de min en max weghalen.
Dan eindig je dus met een array $x en een array $y.
Juist?
O ja ... is het van belang dat de volgorde van de array de zelfde blijft?
-----------------
Zo?
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
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
<?php
$row['getallen'] = '526,596,549,620,530,600'; // komt uit de while($row = fetch...
$getallen = explode(',', $row['getallen']);
$x=null;
$y=null;
oddEven($getallen, $x, $y);
// echo 'even: ' . print_r($x, 1) .'<br>oneven: '. print_r($y, 1) .'<hr>';
$x = removeMinMax($x);
$y = removeMinMax($y);
echo 'even: ' . print_r($x, 1) .'<br>oneven: '. print_r($y, 1) .'<hr>';
function oddEven($original, &$odd, &$even) {
$odd = array();
$even = array();
foreach($original as $key=>$item) {
if ($item % 2 == 0) { // hiermee kan je even/oneven berekenen - zie http://php.net/manual/en/internals2.opcodes.mod.php
$even[] = $item;
}
else {
$odd[] = $item;
}
}
return true;
}
function removeMinMax($items) {
sort($items); // sorteren
array_shift($items); // eerste item weg halen
array_pop($items); // laatste item weg halen
return $items;
}
?>
$row['getallen'] = '526,596,549,620,530,600'; // komt uit de while($row = fetch...
$getallen = explode(',', $row['getallen']);
$x=null;
$y=null;
oddEven($getallen, $x, $y);
// echo 'even: ' . print_r($x, 1) .'<br>oneven: '. print_r($y, 1) .'<hr>';
$x = removeMinMax($x);
$y = removeMinMax($y);
echo 'even: ' . print_r($x, 1) .'<br>oneven: '. print_r($y, 1) .'<hr>';
function oddEven($original, &$odd, &$even) {
$odd = array();
$even = array();
foreach($original as $key=>$item) {
if ($item % 2 == 0) { // hiermee kan je even/oneven berekenen - zie http://php.net/manual/en/internals2.opcodes.mod.php
$even[] = $item;
}
else {
$odd[] = $item;
}
}
return true;
}
function removeMinMax($items) {
sort($items); // sorteren
array_shift($items); // eerste item weg halen
array_pop($items); // laatste item weg halen
return $items;
}
?>
Gewijzigd op 20/09/2013 13:55:52 door Kris Peeters
OK Kris, hier ga ik mij zo dadelijk eens in verdiepen.
Twee opmerkingen:
mijn gedachte de reeks omzetten zodat het een leesbare array wordt is duidelijk overbodig, dat gaat natuurlijk direct met explode...
je haalt de min / max weg... die twee moet ik juist hebben!
De volgorde van de orginele reeks is erg van belang, het zijn x y coords, achter elkaar van map areas.
Bedankt voor het meedenken.
Twee opmerkingen:
mijn gedachte de reeks omzetten zodat het een leesbare array wordt is duidelijk overbodig, dat gaat natuurlijk direct met explode...
je haalt de min / max weg... die twee moet ik juist hebben!
De volgorde van de orginele reeks is erg van belang, het zijn x y coords, achter elkaar van map areas.
Bedankt voor het meedenken.
Gewijzigd op 20/09/2013 14:17:39 door Harry Hartman
Oh, nog veel gemakkelijker.
Zie eens hoe de functies heten om min en max te vinden ...
----
Trouwens, als je je afvraagt, wat die &$ is ... Google "php passing by reference"
Zie eens hoe de functies heten om min en max te vinden ...
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
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
<?php
$row['getallen'] = '526,596,549,620,530,600'; // komt uit de while($row = fetch...
$getallen = explode(',', $row['getallen']);
$x=null;
$y=null;
oddEven($getallen, $x, $y);
$maxX = max($x);
$minX = min($x);
$maxY = max($y);
$minY = min($y);
echo $maxX .' '. $minX .' '. $maxY .' '. $minY;
function oddEven($original, &$even, &$odd) {
$odd = array();
$even = array();
foreach($original as $key=>$item) {
if ($item % 2 == 0) { // hiermee kan je even/oneven berekenen - zie http://php.net/manual/en/internals2.opcodes.mod.php
$even[] = $item;
}
else {
$odd[] = $item;
}
}
return true;
}
?>
$row['getallen'] = '526,596,549,620,530,600'; // komt uit de while($row = fetch...
$getallen = explode(',', $row['getallen']);
$x=null;
$y=null;
oddEven($getallen, $x, $y);
$maxX = max($x);
$minX = min($x);
$maxY = max($y);
$minY = min($y);
echo $maxX .' '. $minX .' '. $maxY .' '. $minY;
function oddEven($original, &$even, &$odd) {
$odd = array();
$even = array();
foreach($original as $key=>$item) {
if ($item % 2 == 0) { // hiermee kan je even/oneven berekenen - zie http://php.net/manual/en/internals2.opcodes.mod.php
$even[] = $item;
}
else {
$odd[] = $item;
}
}
return true;
}
?>
----
Trouwens, als je je afvraagt, wat die &$ is ... Google "php passing by reference"
Gewijzigd op 20/09/2013 14:14:49 door Kris Peeters
Super, weer van alles geleerd!
Bedankt.
EDIT:
Oei, er is een misverstand!
Jij haalt nu min/max van alle even/oneven getallen op, dat is niet de bedoeling.
Even en oneven refereerde naar de array: even: $array[0], $array[2], $array[4] (de Xen) en $array[1], $array[3], $array[5] (de Yen).
De serie bestaat uit (map area poly): x,y,x,y,x,y etc.
Toevoeging op 20/09/2013 15:02:28:
Naar jouw voorbeeld heb ik de function aangepast naar $key:
Opgelost!
Bedankt.
EDIT:
Oei, er is een misverstand!
Jij haalt nu min/max van alle even/oneven getallen op, dat is niet de bedoeling.
Even en oneven refereerde naar de array: even: $array[0], $array[2], $array[4] (de Xen) en $array[1], $array[3], $array[5] (de Yen).
De serie bestaat uit (map area poly): x,y,x,y,x,y etc.
Toevoeging op 20/09/2013 15:02:28:
Naar jouw voorbeeld heb ik de function aangepast naar $key:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
foreach($original as $key=>$item) {
if ($key&1) {
$odd[] = $item;
}
else {
$even[] = $item;
}
}
if ($key&1) {
$odd[] = $item;
}
else {
$even[] = $item;
}
}
Opgelost!
Gewijzigd op 20/09/2013 15:03:15 door Harry Hartman




