Maak array van serie komma gescheiden getallen en verwerk

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Harry Hartman

Harry Hartman

20/09/2013 12:56:16
Quote Anchor link
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?
Gewijzigd op 20/09/2013 12:56:45 door Harry Hartman
 
PHP hulp

PHP hulp

25/11/2024 06:56:12
 
Erwin H

Erwin H

20/09/2013 13:13:13
Quote Anchor link
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.
 
Harry Hartman

Harry Hartman

20/09/2013 13:28:16
Quote Anchor link
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...
 
Kris Peeters

Kris Peeters

20/09/2013 13:38:26
Quote Anchor link
Okay, dus uit je database krijg je
$row['getallen'] = '526,596,549,620,530,600';

Dan doe je dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$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)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
}

?>
Gewijzigd op 20/09/2013 13:55:52 door Kris Peeters
 
Harry Hartman

Harry Hartman

20/09/2013 14:06:13
Quote Anchor link
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.
Gewijzigd op 20/09/2013 14:17:39 door Harry Hartman
 
Kris Peeters

Kris Peeters

20/09/2013 14:11:41
Quote Anchor link
Oh, nog veel gemakkelijker.
Zie eens hoe de functies heten om min en max te vinden ...

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?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;
}

?>


----
Trouwens, als je je afvraagt, wat die &$ is ... Google "php passing by reference"
Gewijzigd op 20/09/2013 14:14:49 door Kris Peeters
 
Harry Hartman

Harry Hartman

20/09/2013 14:21:49
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
foreach($original as $key=>$item) {
    if ($key&1) {
      $odd[] = $item;
    }
    else {
      $even[] = $item;
    }
}

Opgelost!
Gewijzigd op 20/09/2013 15:03:15 door Harry Hartman
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.