Maak array van serie komma gescheiden getallen en verwerk
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
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.
Een string op die manier kan je tot een array verwerken met de functie 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.
Explode is mij bekend maar niet helemaal het antwoord op mijn vraag...
$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
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
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
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