[PHP] Meerdere arrays sorteren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met een script voor mijn werk wat gegevens van een berg domeinnamen uitleest en deze in een database stopt.

Nu ben ik bezig met het uitlezen van de MX records van een domein. Dit is goed te doen met getmxrr. Deze functie maakt 2 arrays aan, de eerste met de naam van de server en een 2e array met daarin de preference (zwaarte) van de server. Bijvoorbeeld wordt aangemaakt:
$MXHost[0] = mx4.server.nl
$MXHost[1] = mx2.server.nl
$MXHost[2] = mx5.server.nl
$MXHost[3] = mx1.server.nl
$MXHost[4] = mx3.server.nl

$MXWeight[0] = 400
$MXWeight[0] = 200
$MXWeight[0] = 500
$MXWeight[0] = 100
$MXWeight[0] = 300

Nu wil ik graag in mijn database de juiste volgorde opslaan, oftewel eerst het laagste weight met bijbehorende server.

Ik zou dus willen dat mijn $MXHost array er na sortering als volgt uitziet:
$MXHost[0] = mx1.server.nl
$MXHost[1] = mx2.server.nl
$MXHost[2] = mx3.server.nl
$MXHost[3] = mx4.server.nl
$MXHost[4] = mx5.server.nl

Ik begrijp dat ik dan moet sorteren via de $MXWeight, maar ik heb geen idee hoe ik dat moet doen.

Iemand die me een stukje (of helemaal ;)) op weg kan en wil helpen??

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Waarom heb je twee losse arrays en niet gewoon één tweedimensionale? De twee arrays die je hier laat zien zijn functioneel van elkaar afhankelijk en horen gewoon in dezelfde datastructuur, en dat maakt het sorteren (met usort) meteen een stukje eenvoudiger.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De reden is dat de functie getmxrr dat niet anders kan:
getmxrr -- Get MX records corresponding to a given Internet host name
Description
bool getmxrr ( string hostname, array &mxhosts [, array &weight] )

Searches DNS for MX records corresponding to hostname. Returns TRUE if any records are found; returns FALSE if no records were found or if an error occurred.

A list of the MX records found is placed into the array mxhosts. If the weight array is given, it will be filled with the weight information gathered.
Het is dus geen onwil, maar onmacht :)

Acties:
  • 0 Henk 'm!

Verwijderd

Waarom maak je niet even een loopje waarin je even alle gegevens op een nuttigere manier rangschikt in een nieuwe array?
En waarom wil je het in vredesnaam in de juiste volgorde in de database opslaan?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op maandag 20 maart 2006 @ 22:47:
Waarom maak je niet even een loopje waarin je even alle gegevens op een nuttigere manier rangschikt in een nieuwe array?
En daar ga ik dus al de mist in, ik snap het hele principe volgens mij van een array niet :'(
En waarom wil je het in vredesnaam in de juiste volgorde in de database opslaan?
Omdat ik in mijn database max 5 MX records wil hebben. En ik wil de juiste volgorde hebben om te weten of ik actie moet ondernemen. Ons 1e MX record is altijd onze eigen server, de 2e een fallback van ons en evt. andere records zijn MX records die door de provider bijvoorbeeld als 'service' worden gegeven (en waar je niet vanaf komt). Aan het eind van het script wat ik aan het maken ben wil ik kunnen triggeren of ik actie moet ondernemen (ofwel, staat mijn eigen server wel als MX1 etc.).

Je moet het op dit moment zien als een vergaarbak, we hebben tussen de 400 en 800 domeinnamen (niemand weet hoeveel) en ik ben nu bezig om iets te maken waar iedereen zijn of haar bekende domeinnamen in kan proppen. Daarna ga ik elke zoveel uur een update laten draaien en over een maand of 3 wil ik inzicht hebben welke domeinen er zijn, bij welke providers, welke MX records, wat is het A record van de www.domein.tld etc. etc. etc.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Zit ik goed te denken als ik zoiets doe:

code:
1
2
3
4
$mx[] = array('mxhost' => $MXHost[0], 'weight' => $MXWeight[0]);
$mx[] = array('mxhost' => $MXHost[1], 'weight' => $MXWeight[1]);
$mx[] = array('mxhost' => $MXHost[2], 'weight' => $MXWeight[2]);
$mx[] = array('mxhost' => $MXHost[3], 'weight' => $MXWeight[3]);


En daarna:
code:
1
array_multisort($weight, SORT_ASC, $mx);


Of ben ik dan compleet in de verkeerde richting?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Duidelijk in de goede richting :)

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$mx[0] = array('mxhost' => $MXHost[0], 'weight' => $MXWeight[0]);
$mx[1] = array('mxhost' => $MXHost[1], 'weight' => $MXWeight[1]);
$mx[2] = array('mxhost' => $MXHost[2], 'weight' => $MXWeight[2]);
$mx[3] = array('mxhost' => $MXHost[3], 'weight' => $MXWeight[3]);

foreach ($mx as $key => $row) {
   $mxhost[$key]  = $row['mxhost'];
   $weight[$key] = $row['weight'];
}

array_multisort($weight, SORT_DESC, $mx);

print "host {$mx[0]['mxhost']} weight {$mx[0]['weight']}<br>";
print "host {$mx[1]['mxhost']} weight {$mx[1]['weight']}<br>";
print "host {$mx[2]['mxhost']} weight {$mx[2]['weight']}<br>";
print "host {$mx[3]['mxhost']} weight {$mx[3]['weight']}<br>";


Die foreach moest ertussen om de sortering te laten werken. Ben er nog niet helemaal uit wat die foreach nou eigenlijk doet, maar dat zoek ik wel uit.

Opgelost gok ik :)

Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 16:36
Volgens mij kan het gewoon zo:
PHP:
1
2
3
4
5
6
7
8
$hosts = array();

asort($MXWeight);
foreach($MXweight as $key => $value) {
  $hosts[] = $MXHost[$key];
}
//list hosts array
printr($hosts);


Voor je multisort oplossing kun je verder natuurlijk ook gewoon array elementen de getmxrr() functie ingooien:
PHP:
1
2
3
4
5
$mx = array(
  'hosts' => array();
  'weight' => array();
}
getmxrr ( $hostname, $mx['hosts'] [, $mx['weight']);

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Thx T-MOB, die 2e ga ik usen. Scheelt weer paar regeltjes. (Ben niet zo'n geweldige programmeur, los vaak dingen met teveel regels op :()
Pagina: 1