#!/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); } $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)); ?>