[php] multi array sorteren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • HenkS
  • Registratie: Mei 2000
  • Laatst online: 20-09 20:44

HenkS

Da_king alias HenkS

Topicstarter
hallo, ik heb de volgende array:

Array
(
[GLN-Office-Kerensheide] => Array
(
[2887032832] => 255.255.224.0
)

[GLN-Office-Maurits] => Array
(
[2887081984] => 255.255.224.0
)

[testsubnet] => Array
(
[2690910720] => 255.255.255.0
)

[GLN-subnetisrangesubnet] => Array
(
[2886735872] => 255.255.255.0
)
)

nu moet er op de naam of op het grote getal (tussen []) gesorteerd kunnen worden, afhankelijk van de user instellingen!

op de naam is easy en doe ik met ksort($ARRAY)

maar op dat getal tussen [] krijg ik dus echt niet voor elkaar

ik heb het als volgt geprobeerd:
PHP:
1
2
3
4
5
6
7
usort($SUBNETS,"cmp2");

function cmp2 ($a, $b){
  global $w_o;
  if ($a[$w_o] == $b[$w_o]) return 0;
  return ($a[$w_o] < $b[$w_o]) ? -1 : 1;
}


want op php.net stond dat dit zou werken, en je zou in $w_o dan de array kolom mee moeten geven waarop je wilt sorteren...

maar ten 1e zou ik niet weten wat hierin te zetten en ten 2e krijg ik het dus echt niet werkend

kan iemand me aub beetje op weg helpen, want ik heb op php.net alle comments bu usort() gelezen en kom er niet echt wijs uit... want vaak zijn de arrays anders opgebouwd dan de mijne..

thanks

Acties:
  • 0 Henk 'm!

Verwijderd


Acties:
  • 0 Henk 'm!

  • HenkS
  • Registratie: Mei 2000
  • Laatst online: 20-09 20:44

HenkS

Da_king alias HenkS

Topicstarter
ja ik heb alles al gezien, maar lukt echt niet :(

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Probeer je probleem op te splitsen in kleine deel problemen. Het door jou geposte stukje code werkt niet omdat het probeert te sorteren op een veld in een array in een array. Jij wilt sorteren op een key van een array in een array. Probeer eens een functie te schrijven die dat 'grote getal' opleverd. Als je dat werkend hebt kun je vervolgens erg makkelijk een vergelijker maken die met usort te gebruiken is

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • esf
  • Registratie: Juni 2002
  • Laatst online: 21-02 08:56

esf

Met een for() lusje zelf een sorteer algorithme bouwen is toch een oplossing? of doe je het liever adhv een standaard methode?

The hardest thing in the world to understand is the income tax. - Albert Einstein


  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Als je de array iets anders inricht kan het als volgt:

De array:

PHP:
1
2
3
4
5
$res_array=array('GLN-Office-Kerensheide' => 
Array(
   'nummer' => 2887032832, 
   'ip'           => '255.255.224.0
   ),

....enz.
met de volgende functies:

PHP:
1
2
3
4
5
6
7
8
9
10
11
function aasort($x,$var,$cmp='intcompare'){
    if ( is_string($var) ) $var = "'$var'";
    uasort($x,create_function('$a,$b', 'return '.$cmp.'( $a['.$var.'],$b['.$var.']);'));
    return $x;
}

function intcompare($a,$b){ 
    if (intval($a) > intval($b)) { return(1); }
    if (intval($a) < intval($b)) { return(-1); }
    if (intval($a) == intval($b)) { return(0); }
}


Je kan de $res_array nu met de volgende opdracht op het nummer(subarray) sorteren

PHP:
1
$res_array=aasort($res_array,'nummer','intcompare');


de derde parameter in de aasort functie is de functie die gebruikt wordt om te sorteren. Je kunt daar ook een andere functie aanhangen/gebruiken om bijvoorbeeld op datum of strings of zo te sorteren. (voor strings kun je bijvoorbeeld de standaard php functie 'strcasecmp' gebruiken.

Succes ermee,

Beetle71

[ Voor 12% gewijzigd door beetle71 op 20-02-2003 10:40 ]


  • HenkS
  • Registratie: Mei 2000
  • Laatst online: 20-09 20:44

HenkS

Da_king alias HenkS

Topicstarter
thanks,

dit is 'bijna' een perfecte oplossing maar nu loop ik tegen de volgende problemen op:

ik kom op de volgende manier aan dat 'nummer':
PHP:
1
2
$ips = explode(".", $ip);
$value = ($ips[0] * pow(256,3)) + ($ips[1] * pow(256,2)) + ($ips[2] * 256) + $ips[3];


hiermee reken ik een ipnr dus om, er komt dus een $value uit en dat is dat nummer...

nu loop ik met dit 'nummer' tegen een paar problemen op:

ten 1e ziet hij het als een string, en voordat ie de array vul, moet het nummer tussen een bepaald bereik zitten, er wordt dus met een if gewerkt met < en > tekens.

nu ziet hij het nummer dus als string, en zou je denken, ik maar er een integer van door intval() te gebruiken, net zoals jij hierboven doet, maar dan komt het probleem:
Remember that INTVAL can only work with values between -2147483648 and 2147483647. Anything smaller or larger (respectively) and INTVAL will truncate it.
en hier is het probleem, want mijn getallen zijn dus groter :( dus wordt het getruncate en heb ik er geen fluit meer aan :(

heeft iemand een oplossing om van die 'string' dan toch een nummer te maken?

  • Willem2
  • Registratie: Oktober 2000
  • Laatst online: 20-09 06:39

Willem2

Ω is futile

* 1 doet het altijd prima in javascript! ~8-)

en nee, ik houd niet van voetbal... :)


  • HenkS
  • Registratie: Mei 2000
  • Laatst online: 20-09 20:44

HenkS

Da_king alias HenkS

Topicstarter
Willem2 schreef op 20 February 2003 @ 11:30:
* 1 doet het altijd prima in javascript! ~8-)
had ik ook al geprobeerd, en daarna deed ik controlleren met is_int($string) kijken of het een int was, maar ik kreeg dus een negatief antwoord, maar na ff nadenken (jaja) was het ook logisch, want het getal is ook tegroot om als integer gezien te worden..

dus nu heb ik gewoon *1 gedaan, die controlle eruit, en overal intval() eruit en het werkt nu allemaal perfect!!!

thanks!!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
nu ziet hij het nummer dus als string, en zou je denken, ik maar er een integer van door intval() te gebruiken, net zoals jij hierboven doet, maar dan komt het probleem:
$value is geen string maar een float...

probeer maar:
PHP:
1
2
3
4
5
6
7
$ip='255.255.255.0';
$ips = explode(".", $ip); 
$value = ($ips[0] * pow(256,3)) + ($ips[1] * pow(256,2)) + ($ips[2] * 256) + $ips[3];
var_dump($value);
if ($value==4294967040){
echo 'Je kunt er gewoon mee vergelijken';
}


Laat anders het stukje code waar je die > en < dan gebruikt even zien..

edit:

Te laat ;) ;)

[ Voor 8% gewijzigd door beetle71 op 20-02-2003 11:49 ]

Pagina: 1