1<?php
2
3/** @file callbackfilteriterator.inc
4 * @ingroup Examples
5 * @brief class CallbackFilterIterator
6 * @author  Marcus Boerger
7 * @author  Kevin McArthur
8 * @date    2006 - 2006
9 *
10 * SPL - Standard PHP Library
11 */
12
13/** @ingroup Examples
14 * @brief   A non abstract FiletrIterator that uses a callback foreach element
15 * @author  Marcus Boerger
16 * @author  Kevin McArthur
17 * @version 1.0
18 */
19class CallbackFilterIterator extends FilterIterator
20{
21	const USE_FALSE = 0;  /**< mode: accept no elements, no callback */
22	const USE_TRUE  = 1;  /**< mode: accept all elements, no callback */
23	const USE_VALUE = 2;  /**< mode: pass value to callback */
24	const USE_KEY   = 3;  /**< mode: pass key to callback */
25	const USE_BOTH  = 4;  /**< mode: pass value and key to callback */
26
27	const REPLACE   = 0x00000001; /**< flag: pass key/value by reference */
28
29	private $callback; /**< callback to use */
30	private $mode;     /**< mode any of USE_VALUE, USE_KEY, USE_BOTH */
31	private $flags;    /**< flags (REPLACE) */
32	private $key;      /**< key value */
33	private $current;  /**< current value */
34
35	/** Construct a CallbackFilterIterator
36	 *
37	 * @param it        inner iterator (iterator to filter)
38	 * @param callback  callback function
39	 * @param mode      any of USE_VALUE, USE_KEY, USE_BOTH
40	 * @param flags     any of 0, REPLACE
41	 */
42	public function __construct(Iterator $it, $callback, $mode = self::USE_VALUE, $flags = 0)
43	{
44		parent::__construct($it);
45		$this->callback = $callback;
46		$this->mode     = $mode;
47		$this->flags    = $flags;
48	}
49
50	/** Call the filter callback
51	 * @return result of filter callback
52	 */
53	public function accept()
54	{
55		$this->key     = parent::key();
56		$this->current = parent::current();
57
58		switch($this->mode) {
59		default:
60		case self::USE_FALSE;
61			return false;
62		case self::USE_TRUE:
63			return true;
64		case self::USE_VALUE:
65			if($this->flags & self::REPLACE) {
66				return (bool) call_user_func($this->callback, &$this->current);
67			} else {
68				return (bool) call_user_func($this->callback, $this->current);
69			}
70		case self::USE_KEY:
71			if($this->flags & self::REPLACE) {
72				return (bool) call_user_func($this->callback, &$this->key);
73			} else {
74				return (bool) call_user_func($this->callback, $this->key);
75			}
76		case SELF::USE_BOTH:
77			if($this->flags & self::REPLACE) {
78				return (bool) call_user_func($this->callback, &$this->key, &$this->current);
79			} else {
80				return (bool) call_user_func($this->callback, $this->key, $this->current);
81			}
82		}
83	}
84
85	/** @return current key value */
86	function key()
87	{
88		return $this->key;
89	}
90
91	/** @return current value */
92	function current()
93	{
94		return $this->current;
95	}
96
97	/** @return operation mode */
98	function getMode()
99	{
100		return $this->mode;
101	}
102
103	/** @param $mode set new mode, @see mode */
104	function setMode($mode)
105	{
106		$this->mode = $mode;
107	}
108
109	/** @return operation flags */
110	function getFlags()
111	{
112		return $this->flags;
113	}
114
115	/** @param $flags set new flags, @see flags */
116	function setFlags($flags)
117	{
118		$this->flags = $flags;
119	}
120}
121
122?>