Version: 1.1
Type: Class
Category: Games
License: GNU General Public License
Description: PHP class for creating multiple-choice quizzes on your web site. Configurable with an XML file--no need for a database. Fast, easy to use. Create one quiz object and store as a session variable for each testtaker. Flexible: display questions as you wish. Allows multiple correct answers for each question. XML must be compiled into your instance of PHP to use. Find an example of it at http://www.adamclymerfanclub.org/clymertrivia.php For more documentation, including an XML configuration example, go to http://www.zrusilla.com/lizquiz.html Comments and bug reports to liz@zrusilla.com.
<?php
class question {
var $question;
var $order;
var $choices = array();
var $correct;
var $choice;
function question ($ary) {
foreach ($ary as $k => $v) {
switch ($v["tag"]) {
case "question":
$this->question = $v["value"];
break;
case "answer":
$attrs = $v["attributes"];
if ($attrs["correct"] == "yes") {
$this->correct= $attrs["order"];
}
$this->choices[$attrs["order"]] = $v["value"];
break;
default:
break;
}
}
}
function dump () {
echo "Dump object question<br>";
echo "question: $this->question<br>";
foreach ($this->choices as $k => $v) {
echo "$k: $v<br>";
}
echo "correct: $this->correct<P>";
}
}
class quiz {
// set of question objects
var $questions = array();
var $points;
var $name;
function quiz ($file) {
if (!file_exists($file)) {return $ary;}
$values = array();
$tags = array();
$data = join("",file($file));
$parser = xml_parser_create();
xml_parser_set_option($parser,XML_OPTION_CASE_FOLDING,0);
xml_parser_set_option($parser,XML_OPTION_SKIP_WHITE,1);
xml_parse_into_struct($parser,$data,&$values,&$tags);
xml_parser_free($parser);
$this->name = $values[0]["attributes"]["name"];
# parse out each question
$items = $tags["item"];
for ($i = 0; $i < count($items); $i+=2) {
$lower = $items[$i];
$upper = $items[$i+1];
// get question number
$item = $values[$lower];
$number = $item["attributes"]["number"];
// get question data and pass to question object
$lower++;
$length = $upper-$lower;
$upper--;
$this->questions[$number] = new question(array_slice($values, $lower, $length));
# debug
#$this->questions[$number]->dump();
}
ksort($this->questions);
reset($this->questions);
# debugging
#echo "<pre>";
#print_r($tags);
#print_r($values);
#echo "</pre>";
}
//get the question array length
function length () {
return count($this->questions);
}
//get the question
function question($id) {
return $this->questions[$id]->question;
}
//get the choices for the question
function choices($id) {
return $this->questions[$id]->choices;
}
//add testtaker's answer
function tally($id, $choice) {
$this->questions[$id]->choice = $choice;
}
//return array of testtaker's answers
function get_answers() {
$choices = array();
foreach ($this->questions as $id => $q) {
$answers["$id"] = $q->choice;
}
return $answers;
}
//return array of correct answers
function get_correct() {
$correct = array();
foreach ($this->questions as $id => $q) {
$correct["$id"] = $q->correct;
}
return $correct;
}
function score() {
$points = 0;
foreach ($this->questions as $id => $q) {
if ($q->choice == $q->correct) {
$points++;
}
}
return $points;
}
}
?>