I've updated my voting system to allow preferential voting (the previous method uses approval voting). It gives a score to each candidate based on its rank. E.g. if there are 10 candidates, and you give a candidate 1st preference, it gets 10 points, second preference gets 9 points, etc.
It's therefore functionally equivalent to "range voting".
<?php
/* How to use: Put all emails in an array with values in $emails["text"] and $emails["user_id"]; Put the list of valid candidates in the function valid_candidate(); Put the check for user-authorisation in function valid_user(); Enjoy. */
$emails_array = array( array("user_id"=>234, "text"=>" option1 = 1 option3 = 2 optionwhatever = 3 "), // Duplicate user, will be handled correctly. array("user_id"=>234, "text"=>" Oops forgot one I like: Optionfour = 2 // Did I mention: option1=1 " ), array("user_id"=>1234, "text"=>" // I hate option1 Option1 = 6 option2 = 1 ") );
function valid_user($user_id){return true;} // put user filter in here if necessary function valid_candidate($name){ return true;} // is the name one of the candidates?
$number_of_options = 6;
// Process all emails foreach ($emails_array as $email) {
// Is it a valid registered user? if (valid_user($email["user_id"])) {
// Process each line of the email $email_lines = explode("\n", trim($email["text"])); foreach ($email_lines as $this_line) { // Does it have an '=' sign and only one = sign $equals_sign = strpos($this_line, "="); if ($equals_sign !== false) { $cleaned_up_line_text = trim($this_line, ";.!\t\n\r\0"); $parts_of_line = explode("=", $cleaned_up_line_text); if (count($parts_of_line) == 2) { // Is it a valid candidate and rank? // Candidate is in lower case. $candidate = strtolower(trim($parts_of_line[0])); $rank = intval(trim($parts_of_line[1])); if (valid_candidate($candidate) && ($rank > 0) && ($rank <= $number_of_options)) { // Get the score for this candidate. // The score is the number of options - how far it is ranked below 1. // e.g. a rank of 1 would give it a score of $number_of_options. // a rank of 2 gives it a score of $number_of_options -1. // See "range voting". $score = $number_of_options - ($rank-1);
// Make sure this vote for this user hasn't already been cast if (!isset($user_votes[$email["user_id"]]) || !isset($user_votes[$email["user_id"]][$candidate])) { // Remember this user has voted for this name already. $user_votes[$email["user_id"]][$candidate] = true;
// Count the vote towards the total if (!isset($candidate_votes[$candidate])) $candidate_votes[$candidate]=$score; else $candidate_votes[$candidate]+= $score; } } // end of check for valid vote values. } // of check for correctly formatted vote } // of check for equals sign } // End of for loop for lines of email } // of check for valid user. } // end of for loop for all emails.
Updated email-scraping voting system to allow preferences
I've updated my voting system to allow preferential voting (the previous method uses approval voting). It gives a score to each candidate based on its rank. E.g. if there are 10 candidates, and you give a candidate 1st preference, it gets 10 points, second preference gets 9 points, etc.
It's therefore functionally equivalent to "range voting".
Post Comment