ILIAS  Release_4_4_x_branch Revision 61816
 All Data Structures Namespaces Files Functions Variables Groups Pages
class.assClozeGap.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 include_once "./Modules/Test/classes/inc.AssessmentConstants.php";
5 
19 {
20 
29  var $type;
30 
38  var $items;
39 
45  var $shuffle;
46 
53  public function assClozeGap($a_type)
54  {
55  $this->type = $a_type;
56  $this->items = array();
57  $this->shuffle = true;
58  }
59 
69  public function getType()
70  {
71  return $this->type;
72  }
73 
81  public function setType($a_type = 0)
82  {
83  $this->type = $a_type;
84  }
85 
95  function getItems()
96  {
97  if ($this->shuffle)
98  {
99  return $this->arrayShuffle($this->items);
100  }
101  else
102  {
103  return $this->items;
104  }
105  }
106 
116  function getItemsRaw()
117  {
118  return $this->items;
119  }
120 
130  function getItemCount()
131  {
132  return count($this->items);
133  }
134 
144  function addItem($a_item)
145  {
146  $order = $a_item->getOrder();
147  if (array_key_exists($order, $this->items))
148  {
149  $newitems = array();
150  for ($i = 0; $i < $order; $i++)
151  {
152  array_push($newitems, $this->items[$i]);
153  }
154  array_push($newitems, $a_item);
155  for ($i = $order; $i < count($this->items); $i++)
156  {
157  array_push($newitems, $this->items[$i]);
158  }
159  $i = 0;
160  foreach ($newitems as $idx => $item)
161  {
162  $newitems[$idx]->setOrder($i);
163  $i++;
164  }
165  $this->items = $newitems;
166  }
167  else
168  {
169  array_push($this->items, $a_item);
170  }
171  }
172 
183  function setItemPoints($order, $points)
184  {
185  foreach ($this->items as $key => $item)
186  {
187  if ($item->getOrder() == $order)
188  {
189  $item->setPoints($points);
190  }
191  }
192  }
193 
203  function deleteItem($order)
204  {
205  if (array_key_exists($order, $this->items))
206  {
207  unset($this->items[$order]);
208  $order = 0;
209  foreach ($this->items as $key => $item)
210  {
211  $this->items[$key]->setOrder($order);
212  $order++;
213  }
214  }
215  }
216 
227  function setItemLowerBound($order, $bound)
228  {
229  foreach ($this->items as $key => $item)
230  {
231  if ($item->getOrder() == $order)
232  {
233  $item->setLowerBound($bound);
234  }
235  }
236  }
237 
248  function setItemUpperBound($order, $bound)
249  {
250  foreach ($this->items as $key => $item)
251  {
252  if ($item->getOrder() == $order)
253  {
254  $item->setUpperBound($bound);
255  }
256  }
257  }
258 
268  function getItem($a_index)
269  {
270  if (array_key_exists($a_index, $this->items))
271  {
272  return $this->items[$a_index];
273  }
274  else
275  {
276  return NULL;
277  }
278  }
279 
288  function clearItems()
289  {
290  $this->items = array();
291  }
292 
300  public function setShuffle($a_shuffle = true)
301  {
302  $this->shuffle = (bool) $a_shuffle;
303  }
304 
310  public function getShuffle()
311  {
312  return $this->shuffle;
313  }
314 
329  function arrayShuffle($array)
330  {
331  mt_srand((double)microtime()*1000000);
332  $i = count($array);
333  if ($i > 0)
334  {
335  while(--$i)
336  {
337  $j = mt_rand(0, $i);
338  if ($i != $j)
339  {
340  // swap elements
341  $tmp = $array[$j];
342  $array[$j] = $array[$i];
343  $array[$i] = $tmp;
344  }
345  }
346  }
347  return $array;
348  }
349 
358  function getMaxWidth()
359  {
360  $maxwidth = 0;
361  foreach ($this->items as $item)
362  {
363  if (strlen($item->getAnswertext()) > $maxwidth)
364  {
365  $maxwidth = strlen($item->getAnswertext());
366  }
367  }
368  return $maxwidth;
369  }
370 
380  {
381  $maxpoints = 0;
382  foreach ($this->items as $key => $item)
383  {
384  if ($item->getPoints() > $maxpoints)
385  {
386  $maxpoints = $item->getPoints();
387  }
388  }
389  $keys = array();
390  foreach ($this->items as $key => $item)
391  {
392  if ($item->getPoints() == $maxpoints)
393  {
394  array_push($keys, $key);
395  }
396  }
397  return $keys;
398  }
399 
401  {
402  global $lng;
403  switch ($this->getType())
404  {
405  case CLOZE_TEXT:
406  case CLOZE_SELECT:
407  $best_solutions = array();
408  foreach ($this->getItems() as $answer)
409  {
410  if (is_array($best_solutions[$answer->getPoints()]))
411  {
412  array_push($best_solutions[$answer->getPoints()], $answer->getAnswertext());
413  }
414  else
415  {
416  $best_solutions[$answer->getPoints()] = array();
417  array_push($best_solutions[$answer->getPoints()], $answer->getAnswertext());
418  }
419  }
420  krsort($best_solutions, SORT_NUMERIC);
421  reset($best_solutions);
422  $found = current($best_solutions);
423  return join(" " . $lng->txt("or") . " ", $found);
424  break;
425  case CLOZE_NUMERIC:
426  $maxpoints = 0;
427  $foundvalue = "";
428  foreach ($this->getItems() as $answer)
429  {
430  if ($answer->getPoints() >= $maxpoints)
431  {
432  $maxpoints = $answer->getPoints();
433  $foundvalue = $answer->getAnswertext();
434  }
435  }
436  return $foundvalue;
437  break;
438  default:
439  return "";
440  }
441  }
442 }