155 lines
4.0 KiB
PHP
155 lines
4.0 KiB
PHP
#!/bin/env php
|
|
<?php
|
|
|
|
if (count($argv) > 1) {
|
|
$poll_file=$argv[1];
|
|
}
|
|
else {
|
|
print('missing file argument');
|
|
exit(1);
|
|
}
|
|
|
|
$verbose=False;
|
|
|
|
# $poll_fd=fopen($poll_file,'r');
|
|
$poll_json=file_get_contents($poll_file);
|
|
$poll=json_decode($poll_json,True);
|
|
|
|
if ($verbose) {
|
|
print($poll_json);
|
|
print('=== json ===');
|
|
var_dump($poll);
|
|
}
|
|
|
|
$voters=$poll['voters']['count'];
|
|
$candidates=$poll['candidates'];
|
|
$nombre_candidates=count($candidates);
|
|
|
|
# l'ordre des mentions est de la meilleure à la pire (reject)
|
|
$nom_mentions=$poll['mentions'];
|
|
$mentions=count($nom_mentions);
|
|
|
|
$default_mention=$mentions-1;
|
|
|
|
$votes=$poll["votation"]["votes"];
|
|
if ($verbose) {
|
|
print("candidates\n");
|
|
var_dump($candidates);
|
|
print("votes:\n");
|
|
var_dump($votes);
|
|
}
|
|
|
|
$warnings=[];
|
|
$default_vote=[];
|
|
foreach ($candidates as $candidat => $nom_candidat ) {
|
|
$default_vote[$candidat]=$default_mention;
|
|
}
|
|
|
|
$collect=[];
|
|
foreach ($votes as $vote) {
|
|
# missing candidat in vote is the worts one
|
|
foreach ($candidates as $candidat => $nom_candidat ) {
|
|
if (! array_key_exists($candidat,$vote)) {
|
|
$vote[$candidat]=$default_mention;
|
|
}
|
|
}
|
|
|
|
foreach ( $vote as $candidat => $mention ) {
|
|
if ($mention > $default_mention or $mention < 0) {
|
|
$mention = $default_mention;
|
|
array_push($warnings,"index de mention invalide, soit la liste des mentions est erronnée soit la mention dans le vote est erronée");
|
|
}
|
|
if ( array_key_exists($candidat,$collect)) {
|
|
if ( array_key_exists($mention,$collect[$candidat])) {
|
|
$collect[$candidat][$mention]=$collect[$candidat][$mention]+1;
|
|
}
|
|
else {
|
|
$collect[$candidat][$mention]=1;
|
|
}
|
|
}
|
|
else {
|
|
$collect[$candidat]=[$mention => 1];
|
|
}
|
|
}
|
|
}
|
|
|
|
if ($verbose) {
|
|
print("collect:\n");
|
|
print(json_encode($collect));
|
|
}
|
|
|
|
$voter_median_check= ($voters % 2 == 0) ? intdiv($voters,2) : intdiv(($voters-1),2) + 1;
|
|
|
|
$voter_median=intdiv($voters, 2) + $voters % 2;
|
|
|
|
if ( $voter_median_check != $voter_median ) {
|
|
print('[ERROR] le nombre median de voters (' . $voter_median_check . '/' . $voter_median . ') semble erroné. contactez le developpeur de ce code.');
|
|
}
|
|
|
|
$merit=[];
|
|
$mention_mediane=[];
|
|
$merit_pourcent=[];
|
|
|
|
# cumul : du meilleur au pire
|
|
# range_mentions = range(count(mentions))
|
|
# cumul du pire au meilleur
|
|
$range_mentions = $mentions;
|
|
|
|
foreach ($candidates as $candidat => $nom_candidat) {
|
|
$vote=$collect[$candidat];
|
|
$cumul=0;
|
|
for ($i=0; $i < $range_mentions; $i ++) {
|
|
$m[$i]=0;
|
|
$pourcent[$i]=0;
|
|
}
|
|
$mention_m=null;
|
|
for ($mention=$range_mentions -1; $mention >=0; $mention --) {
|
|
if ( array_key_exists($mention,$vote) ) {
|
|
$cumul=$cumul+$vote[$mention];
|
|
$pourcent[$mention]= ( 100 * $vote[$mention] ) / $voters;
|
|
}
|
|
if ($cumul >= $voter_median and $mention_m == null ) {
|
|
$mention_m=$mention;
|
|
}
|
|
$m[$mention]=$cumul;
|
|
}
|
|
if ($cumul < $voters) {
|
|
print("[ERROR] votes cumulated " . $cumul . " should match voters. Contact this code developer.");
|
|
}
|
|
$mention_mediane[$candidat]=$mention_m;
|
|
$merit[$candidat]=$m;
|
|
$merit_pourcent[$candidat]=$pourcent;
|
|
}
|
|
|
|
if ($verbose) {
|
|
print("\nmerit:\n");
|
|
print(json_encode($merit));
|
|
print("\nmention_mediane:\n");
|
|
print(json_encode($mention_mediane));
|
|
}
|
|
|
|
# les gagnants sont ceux qui ont la mention mediane minimale ( la meilleure )
|
|
$found=[];
|
|
|
|
for ($mention = 0; $mention < $mentions; $mention ++) {
|
|
foreach ($mention_mediane as $candidat => $merit_median)
|
|
if ($merit_median == $mention) {
|
|
$item=[];
|
|
$item[$candidat]=$candidates[$candidat];
|
|
array_push($found,$item);
|
|
}
|
|
if (count($found) > 0) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
if ($verbose) {
|
|
print($found);
|
|
print($nom_mentions[$mention]);
|
|
}
|
|
|
|
$result = ['result'=> ['mention'=>$nom_mentions[$mention],'candidates' => $found],'merit' => $merit,'profil' => $merit_pourcent,"warnings" => $warnings];
|
|
|
|
print(json_encode($result));
|
|
|
|
?>
|