--TEST-- Test key(), current(), next() & reset() functions --FILE-- returns the index element of the current array position mixed current ( array &$array ) -> returns the current element in the array mixed next ( array &$array ) -> similar to current() but advances the internal pointer to next element mixed reset ( array &$array ) -> Reset the internal pointer to first element */ $basic_arrays = array ( array(0), // array with element as 0 array(1), // array with single element array(1,2, 3, -1, -2, -3), // array of integers array(1.1, 2.2, 3.3, -1.1, -2.2, -3.3), // array of floats array('a', 'b', 'c', "ab", "ac", "ad"), // string array array("a" => "apple", "b" => "book", "c" => "cook"), // associative array array('d' => 'drink', 'p' => 'port', 's' => 'set'), // another associative array array(1 => 'One', 2 => 'two', 3 => "three") // associative array with key as integers ); $varient_arrays = array ( array(), // empty array array(""), // array with null string array(NULL),// array with NULL array(null),// array with null array(NULL, true, null, "", 1), // mixed array array(-1.5 => "test", -2 => "rest", 2.5 => "two", "" => "string", 0 => "zero", "" => "" ) // mixed array ); echo "*** Testing basic operations ***\n"; $loop_count = 1; foreach ($basic_arrays as $sub_array ) { echo "-- Iteration $loop_count --\n"; $loop_count++; $c = count ($sub_array); $c++; // increment by one to create the situation of accessing beyond array size while ( $c ) { var_dump( current($sub_array)); // current element var_dump( key($sub_array) ); // key of the current element var_dump( next($sub_array) ); // move to next element $c --; } var_dump( reset($sub_array) ); // reset the internal pointer to first element var_dump( key($sub_array) ); // access the array after reset var_dump( $sub_array ); // dump the array to see that its intact echo "\n"; } echo "\n*** Testing possible variations ***\n"; $loop_count = 1; foreach ($varient_arrays as $sub_array ) { echo "-- Iteration $loop_count --\n"; $loop_count++; $c = count ($sub_array); $c++; // increment by one to create the situation of accessing beyond array size while ( $c ) { var_dump( current($sub_array)); // current element var_dump( key($sub_array) ); // key of the current element var_dump( next($sub_array) ); // move to next element $c --; } var_dump( reset($sub_array) ); // reset the internal pointer to first element var_dump( key($sub_array) ); // access the array after reset var_dump( $sub_array ); // dump the array to see that its intact echo "\n"; } /*test these functions on array which is already unset */ echo "\n-- Testing variation: when array is unset --\n"; $unset_array = array (1); unset($unset_array); var_dump( current($unset_array) ); var_dump( key($unset_array) ); var_dump( next($unset_array) ); var_dump( reset($unset_array) ); echo "\n*** Testing error conditions ***\n"; //Zero argument, expected 1 argument var_dump( key() ); var_dump( current() ); var_dump( reset() ); var_dump( next() ); // args more than expected, expected 1 argument $temp_array = array(1); var_dump( key($temp_array, $temp_array) ); var_dump( current($temp_array, $temp_array) ); var_dump( reset($temp_array, $temp_array) ); var_dump( next($temp_array, $temp_array) ); // invalid args type, valid arguement: array $int_var = 1; $float_var = 1.5; $string = "string"; var_dump( key($int_var) ); var_dump( key($float_var) ); var_dump( key($string) ); var_dump( current($int_var) ); var_dump( current($float_var) ); var_dump( current($string) ); var_dump( next($int_var) ); var_dump( next($float_var) ); var_dump( next($string) ); var_dump( reset($int_var) ); var_dump( reset($float_var) ); var_dump( reset($string) ); echo "\n*** Testing operation on Objects ***\n"; // class having members of different scope class test_class { private $private_var = "private_var"; public $public_var = "public_var"; protected $protected_var = "protected_var"; private $var1 = 10; public $var2 = 30; protected $var3 = 40; var $integer = 3092; private function private_fun() { echo "private_fun() called\n"; } protected function protected_fun() { echo "protected_fun() called\n"; } public function public_fun() { echo "public_fun() called\n"; } } // class with no member variables class zero_member_var_class { public function fun() { echo "fun() called\n"; } } // class with no members class zero_member_class { // no members } //create object of all classes defined above $test_class_obj = new test_class(); $zero_member_var_class_obj = new zero_member_var_class(); $zero_member_class_obj = new zero_member_class(); $object_array = array ( $test_class_obj, $zero_member_var_class_obj, $zero_member_class_obj ); /* loop to use function key(), current(), next() and reset() on different class objects */ $loop_count = 1; foreach( $object_array as $object ) { echo "--- Outerloop Iteration $loop_count ---\n"; /* dump the object before performing operation on it */ echo "Object before performing operations ...\n"; var_dump($object) ; /* loop to feach all the key/value pair from the object*/ $inner_loop_count = 1; do { echo "-- Innerloop iteration $inner_loop_count of Outerloop Iteration $loop_count --\n"; $inner_loop_count ++; // print the key/value pair of the current value echo "current => "; var_dump( current($object) ); // key & value pair echo "key => "; var_dump( key($object) ); // key $next_pair = next($object); echo "next => "; var_dump($next_pair); } while( FALSE != $next_pair ); $loop_count++; /* reset the object */ echo "reset => "; var_dump( reset($object) ); echo "current => "; var_dump( current($object) ); // first variable in object echo "\nObject after performing operations ...\n"; var_dump($object) ; // no change expected } echo "Done\n"; ?> --EXPECTF-- *** Testing basic operations *** -- Iteration 1 -- int(0) int(0) bool(false) bool(false) NULL bool(false) int(0) int(0) array(1) { [0]=> int(0) } -- Iteration 2 -- int(1) int(0) bool(false) bool(false) NULL bool(false) int(1) int(0) array(1) { [0]=> int(1) } -- Iteration 3 -- int(1) int(0) int(2) int(2) int(1) int(3) int(3) int(2) int(-1) int(-1) int(3) int(-2) int(-2) int(4) int(-3) int(-3) int(5) bool(false) bool(false) NULL bool(false) int(1) int(0) array(6) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(-1) [4]=> int(-2) [5]=> int(-3) } -- Iteration 4 -- float(1.1) int(0) float(2.2) float(2.2) int(1) float(3.3) float(3.3) int(2) float(-1.1) float(-1.1) int(3) float(-2.2) float(-2.2) int(4) float(-3.3) float(-3.3) int(5) bool(false) bool(false) NULL bool(false) float(1.1) int(0) array(6) { [0]=> float(1.1) [1]=> float(2.2) [2]=> float(3.3) [3]=> float(-1.1) [4]=> float(-2.2) [5]=> float(-3.3) } -- Iteration 5 -- string(1) "a" int(0) string(1) "b" string(1) "b" int(1) string(1) "c" string(1) "c" int(2) string(2) "ab" string(2) "ab" int(3) string(2) "ac" string(2) "ac" int(4) string(2) "ad" string(2) "ad" int(5) bool(false) bool(false) NULL bool(false) string(1) "a" int(0) array(6) { [0]=> string(1) "a" [1]=> string(1) "b" [2]=> string(1) "c" [3]=> string(2) "ab" [4]=> string(2) "ac" [5]=> string(2) "ad" } -- Iteration 6 -- string(5) "apple" string(1) "a" string(4) "book" string(4) "book" string(1) "b" string(4) "cook" string(4) "cook" string(1) "c" bool(false) bool(false) NULL bool(false) string(5) "apple" string(1) "a" array(3) { ["a"]=> string(5) "apple" ["b"]=> string(4) "book" ["c"]=> string(4) "cook" } -- Iteration 7 -- string(5) "drink" string(1) "d" string(4) "port" string(4) "port" string(1) "p" string(3) "set" string(3) "set" string(1) "s" bool(false) bool(false) NULL bool(false) string(5) "drink" string(1) "d" array(3) { ["d"]=> string(5) "drink" ["p"]=> string(4) "port" ["s"]=> string(3) "set" } -- Iteration 8 -- string(3) "One" int(1) string(3) "two" string(3) "two" int(2) string(5) "three" string(5) "three" int(3) bool(false) bool(false) NULL bool(false) string(3) "One" int(1) array(3) { [1]=> string(3) "One" [2]=> string(3) "two" [3]=> string(5) "three" } *** Testing possible variations *** -- Iteration 1 -- bool(false) NULL bool(false) bool(false) NULL array(0) { } -- Iteration 2 -- string(0) "" int(0) bool(false) bool(false) NULL bool(false) string(0) "" int(0) array(1) { [0]=> string(0) "" } -- Iteration 3 -- NULL int(0) bool(false) bool(false) NULL bool(false) NULL int(0) array(1) { [0]=> NULL } -- Iteration 4 -- NULL int(0) bool(false) bool(false) NULL bool(false) NULL int(0) array(1) { [0]=> NULL } -- Iteration 5 -- NULL int(0) bool(true) bool(true) int(1) NULL NULL int(2) string(0) "" string(0) "" int(3) int(1) int(1) int(4) bool(false) bool(false) NULL bool(false) NULL int(0) array(5) { [0]=> NULL [1]=> bool(true) [2]=> NULL [3]=> string(0) "" [4]=> int(1) } -- Iteration 6 -- string(4) "test" int(-1) string(4) "rest" string(4) "rest" int(-2) string(3) "two" string(3) "two" int(2) string(0) "" string(0) "" string(0) "" string(4) "zero" string(4) "zero" int(0) bool(false) bool(false) NULL bool(false) string(4) "test" int(-1) array(5) { [-1]=> string(4) "test" [-2]=> string(4) "rest" [2]=> string(3) "two" [""]=> string(0) "" [0]=> string(4) "zero" } -- Testing variation: when array is unset -- Warning: current(): Passed variable is not an array or object in %s on line %d bool(false) Warning: key(): Passed variable is not an array or object in %s on line %d bool(false) Warning: next(): Passed variable is not an array or object in %s on line %d bool(false) Warning: reset(): Passed variable is not an array or object in %s on line %d bool(false) *** Testing error conditions *** Warning: Wrong parameter count for key() in %s on line %d NULL Warning: Wrong parameter count for current() in %s on line %d NULL Warning: Wrong parameter count for reset() in %s on line %d NULL Warning: Wrong parameter count for next() in %s on line %d NULL Warning: Wrong parameter count for key() in %s on line %d NULL Warning: Wrong parameter count for current() in %s on line %d NULL Warning: Wrong parameter count for reset() in %s on line %d NULL Warning: Wrong parameter count for next() in %s on line %d NULL Warning: key(): Passed variable is not an array or object in %s on line %d bool(false) Warning: key(): Passed variable is not an array or object in %s on line %d bool(false) Warning: key(): Passed variable is not an array or object in %s on line %d bool(false) Warning: current(): Passed variable is not an array or object in %s on line %d bool(false) Warning: current(): Passed variable is not an array or object in %s on line %d bool(false) Warning: current(): Passed variable is not an array or object in %s on line %d bool(false) Warning: next(): Passed variable is not an array or object in %s on line %d bool(false) Warning: next(): Passed variable is not an array or object in %s on line %d bool(false) Warning: next(): Passed variable is not an array or object in %s on line %d bool(false) Warning: reset(): Passed variable is not an array or object in %s on line %d bool(false) Warning: reset(): Passed variable is not an array or object in %s on line %d bool(false) Warning: reset(): Passed variable is not an array or object in %s on line %d bool(false) *** Testing operation on Objects *** --- Outerloop Iteration 1 --- Object before performing operations ... object(test_class)#1 (7) { ["private_var:private"]=> string(11) "private_var" ["public_var"]=> string(10) "public_var" ["protected_var:protected"]=> string(13) "protected_var" ["var1:private"]=> int(10) ["var2"]=> int(30) ["var3:protected"]=> int(40) ["integer"]=> int(3092) } -- Innerloop iteration 1 of Outerloop Iteration 1 -- current => string(11) "private_var" key => string(23) "test_classprivate_var" next => string(10) "public_var" -- Innerloop iteration 2 of Outerloop Iteration 1 -- current => string(10) "public_var" key => string(10) "public_var" next => string(13) "protected_var" -- Innerloop iteration 3 of Outerloop Iteration 1 -- current => string(13) "protected_var" key => string(16) "*protected_var" next => int(10) -- Innerloop iteration 4 of Outerloop Iteration 1 -- current => int(10) key => string(16) "test_classvar1" next => int(30) -- Innerloop iteration 5 of Outerloop Iteration 1 -- current => int(30) key => string(4) "var2" next => int(40) -- Innerloop iteration 6 of Outerloop Iteration 1 -- current => int(40) key => string(7) "*var3" next => int(3092) -- Innerloop iteration 7 of Outerloop Iteration 1 -- current => int(3092) key => string(7) "integer" next => bool(false) reset => string(11) "private_var" current => string(11) "private_var" Object after performing operations ... object(test_class)#1 (7) { ["private_var:private"]=> string(11) "private_var" ["public_var"]=> string(10) "public_var" ["protected_var:protected"]=> string(13) "protected_var" ["var1:private"]=> int(10) ["var2"]=> int(30) ["var3:protected"]=> int(40) ["integer"]=> int(3092) } --- Outerloop Iteration 2 --- Object before performing operations ... object(zero_member_var_class)#2 (0) { } -- Innerloop iteration 1 of Outerloop Iteration 2 -- current => bool(false) key => NULL next => bool(false) reset => bool(false) current => bool(false) Object after performing operations ... object(zero_member_var_class)#2 (0) { } --- Outerloop Iteration 3 --- Object before performing operations ... object(zero_member_class)#3 (0) { } -- Innerloop iteration 1 of Outerloop Iteration 3 -- current => bool(false) key => NULL next => bool(false) reset => bool(false) current => bool(false) Object after performing operations ... object(zero_member_class)#3 (0) { } Done