}
// Break up the layout string into pages.
- $pagelayouts = explode(',0', $layout);
+ $pagelayouts = explode(',0', quiz_clean_layout($layout, true));
// Strip off any empty last page (normally there is one).
if (end($pagelayouts) == '') {
* @param boolean $removeemptypages If true, remove empty pages from the quiz. False by default.
* @return $string the cleaned-up layout
*/
-function quiz_clean_layout($layout,$removeemptypages=false){
- //remove duplicate "," (or triple, or...)
- while(strstr($layout,",,")){
- $layout = str_replace(',,', ',', $layout);
- }
- //remove duplicate question ids
- $layout_arr=explode(",",$layout);
- $new_arr=array();
- $seen=array();
- foreach($layout_arr as $key=>$value){
- if(!in_array($value,$seen) && $value!=0){
- $new_arr[]=$value;
- $seen[]=$value;
- }else if($value==0){
- $new_arr[]=0;
- }
+function quiz_clean_layout($layout, $removeemptypages = false){
+ // Remove duplicate "," (or triple, or...)
+ $layout = preg_replace('/,{2,}/', ',', trim($layout, ','));
+
+ // Remove duplicate question ids
+ $layout = explode(',', $layout);
+ $cleanerlayout = array();
+ $seen = array();
+ foreach ($layout as $item) {
+ if ($item == 0) {
+ $cleanerlayout[] = '0';
+ } else if (!in_array($item, $seen)) {
+ $cleanerlayout[] = $item;
+ $seen[] = $item;
+ }
}
- if($removeemptypages){
+
+ if ($removeemptypages) {
// Avoid duplicate page breaks
- // Go through all the array keys
- for($i=0;$i<count($new_arr);$i++){
- //check if the current position and the one after are both zeros
- //remove the one after until they are not both zeros
- while(isset($new_arr[$i+1]) &&
- $new_arr[$i]==0 &&
- $new_arr[$i+1]==0){
- array_splice($new_arr,$i+1,1);
- }
+ $layout = $cleanerlayout;
+ $cleanerlayout = array();
+ $stripfollowingbreaks = true; // Ensure breaks are stripped from the start.
+ foreach ($layout as $item) {
+ if ($stripfollowingbreaks && $item == 0) {
+ continue;
+ }
+ $cleanerlayout[] = $item;
+ $stripfollowingbreaks = $item == 0;
}
}
- $layout=implode(",",$new_arr);
- //remove extra "," from beginning and end
- $layout=trim($layout, ",");
- //add a ",0" (page break) at the end if there is none
- $layoutlength=strlen($layout);
- $last=(strlen($layout)-1);
- if($layoutlength>1 AND
- !($layout[$last-1] == ',' AND $layout[$last] == '0')){
- $layout .= ',0';
+
+ // Add a page break at the end if there is none
+ if (end($cleanerlayout) !== '0') {
+ $cleanerlayout[] = '0';
}
- return $layout;
+ return implode(',', $cleanerlayout);
}
/**
* Print a quiz error message. This is a thin wrapper around print_error, for convinience.
$this->assertEqual(quiz_number_of_questions_in_quiz('1,2,3,0'), 3);
$this->assertEqual(quiz_number_of_questions_in_quiz('0,1,0,0,2,0'), 2);
}
+
+ function test_quiz_clean_layout() {
+ // Without stripping empty pages.
+ $this->assertEqual(quiz_clean_layout(',,1,,,2,,'), '1,2,0');
+ $this->assertEqual(quiz_clean_layout(''), '0');
+ $this->assertEqual(quiz_clean_layout('0'), '0');
+ $this->assertEqual(quiz_clean_layout('0,0'), '0,0');
+ $this->assertEqual(quiz_clean_layout('0,0,0'), '0,0,0');
+ $this->assertEqual(quiz_clean_layout('1'), '1,0');
+ $this->assertEqual(quiz_clean_layout('1,2'), '1,2,0');
+ $this->assertEqual(quiz_clean_layout('1,0,2'), '1,0,2,0');
+ $this->assertEqual(quiz_clean_layout('0,1,0,0,2,0'), '0,1,0,0,2,0');
+
+ // With stripping empty pages.
+ $this->assertEqual(quiz_clean_layout('', true), '0');
+ $this->assertEqual(quiz_clean_layout('0', true), '0');
+ $this->assertEqual(quiz_clean_layout('0,0', true), '0');
+ $this->assertEqual(quiz_clean_layout('0,0,0', true), '0');
+ $this->assertEqual(quiz_clean_layout('1', true), '1,0');
+ $this->assertEqual(quiz_clean_layout('1,2', true), '1,2,0');
+ $this->assertEqual(quiz_clean_layout('1,0,2', true), '1,0,2,0');
+ $this->assertEqual(quiz_clean_layout('0,1,0,0,2,0', true), '1,0,2,0');
+ }
}
?>
\ No newline at end of file