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.print "votes:<br>";
print_r($user_votes);
print "<br><Br>";
print "candiate_votes<Br>";
print_r($candidate_votes);?>
(Score: 2) by prospectacle on Sunday March 23 2014, @01:30AM
Not a good reason, no. I favoured "print" early on, and it became a habit.
Never got too acquainted with their differences, to be honest, beyond satisfying myself that "print" would do everything I wanted.
Should I reconsider?