#!/bin/env php 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); } $votants=$poll['votants']['decompte']; $candidats=$poll['candidats']; $nombre_candidats=count($candidats); # 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("candidats\n"); var_dump($candidats); print("votes:\n"); var_dump($votes); } $warnings=[]; $default_vote=[]; foreach ($candidats as $candidat => $nom_candidat ) { $default_vote[$candidat]=$default_mention; } $collect=[]; foreach ($votes as $vote) { # missing candidat in vote is the worts one foreach ($candidats 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; $warnings.append("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)); } $votant_median_check= ($votants % 2 == 0) ? intdiv($votants,2) : intdiv(($votants-1),2) + 1; $votant_median=intdiv($votants, 2) + $votants % 2; if ( $votant_median_check != $votant_median ) { print('[ERROR] le nombre median de votants (' . $votant_median_check . '/' . $votant_median . ') semble erroné. contactez le developpeur de ce code.'); } $merite=[]; $mention_mediane=[]; $merite_pourcent=[]; # cumul : du meilleur au pire # range_mentions = range(count(mentions)) # cumul du pire au meilleur $range_mentions = $mentions; foreach ($candidats 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] ) / $votants; } if ($cumul >= $votant_median and $mention_m == null ) { $mention_m=$mention; } $m[$mention]=$cumul; } if ($cumul < $votants) { print("[ERROR] le cumul des votes " . $cumul . " doit correspondre au nombre de votants. contactez le developpeur de ce code."); } $mention_mediane[$candidat]=$mention_m; $merite[$candidat]=$m; $merite_pourcent[$candidat]=$pourcent; } if ($verbose) { print("\nmerite:\n"); print(json_encode($merite)); 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 => $merite_median) if ($merite_median == $mention) { $item=[]; $item[$candidat]=$candidats[$candidat]; array_push($found,$item); } if (count($found) > 0) { break; } } if ($verbose) { print($found); print($nom_mentions[$mention]); } $result = ['resultat'=> ['mention'=>$nom_mentions[$mention],'candidats' => $found],'merite' => $merite,'profil' => $merite_pourcent,"warnings" => $warnings]; print(json_encode($result)); ?>