xref: /PHP-7.3/ext/standard/tests/array/end.phpt (revision 782352c5)
1--TEST--
2Test end() function
3--SKIPIF--
4<?php
5if (PHP_INT_SIZE != 4) die("skip this test is for 32bit platform only");
6?>
7--INI--
8precision=14
9--FILE--
10<?php
11/* Prototype: mixed end ( array &$array );
12   Description: Advances internal pointer of array to last element, and returns its value.
13*/
14
15$arrays = array (
16  array( 0 ),
17  range(1, 100 ),
18  range('a', 'z', 2 ),
19  array("a" => "A", 2 => "B", "C" => 3, 4 => 4, "one" => 1, "" => NULL ),
20  array(1, array(1, 2 => 3 ), "one" => 1, "5" => 5 ),
21  array(-1, -2, -3, -4, "-0.005" => "neg0.005", 2.0 => "float2", "neg.9" => -.9 ),
22  array(1.0005, 2.000000, -3.000000, -4.9999999 ),
23  array(true, false),
24  array("PHP", "Web2.0", "SOA"),
25  array(1, array() ),
26  array(1, 2, "" ),
27  array(" "),
28  array(2147483647, 2147483648, -2147483647, -2147483648 ),
29  array(0x7FFFFFFF, -0x80000000, 017777777777, -020000000000 ),
30  array(-.6700000E+3, -4.10003E+3, 1e-5, -1E+5, 000002.00 )
31);
32/* loop through $arrays to print the last element of each sub-array */
33echo "*** Testing end() on different arrays ***\n";
34$counter = 1;
35foreach ($arrays as $sub_array){
36  echo "-- Iteration $counter --\n";
37  var_dump( end($sub_array) );
38  /* ensure that internal pointer is moved to last element */
39  var_dump( current($sub_array) );
40  $counter++;
41}
42
43/* checking for end() on sub-arrays */
44echo "\n*** Testing end() with sub-arrays ***\n";
45$test_array = array(1, array(1 => "one", "two" => 2, "" => "f") );
46var_dump( end($test_array) );
47var_dump( end($test_array[1]) );
48
49/* checking working of end() when array elements are deleted */
50echo "\n*** Testing end() when array elements are deleted ***\n";
51$array_test = array("a", "b", "d", 7, "u" => "U", -4, "-.008" => "neg.008");
52
53// remove first element from array
54echo "\n-- Remove first element from array --\n";
55unset($array_test[0]);
56var_dump( end($array_test) );
57
58// remove last element from array, rewind and check end()
59echo "\n-- Remove last element from array --\n";
60unset($array_test['-.008']);
61var_dump( end($array_test) );
62reset( $array_test );
63var_dump( end($array_test) );
64
65// remove any element  !first, !last, rewind and check end()
66echo "\n-- Remove any element from array apart from first and last element --\n";
67unset($array_test[7]);
68var_dump( end($array_test) );
69var_dump( reset($array_test) );
70var_dump( end($array_test) );
71
72/* Checking on OBJECTS type */
73echo "\n*** Testing end() on objects ***\n";
74class foo
75{
76  function __toString() {
77    return "Object";
78  }
79}
80class foo1
81{
82  function __toString() {
83    return "Object1";
84  }
85}
86
87$object1 = new foo(); //new object created
88$object2 = new foo1();
89
90$array_object = array();
91$array_object[0] = &$object1;
92$array_object[1] = &$object2;
93var_dump( end($array_object) );
94var_dump($array_object);
95
96/* Checking on RESOURCE type */
97echo "\n*** Testing end() on resource type ***\n";
98//file type resource
99$file_handle = fopen(__FILE__, "r");
100
101//directory type resource
102$dir_handle = opendir( dirname(__FILE__) );
103
104//store resources in array
105$resources = array($file_handle, $dir_handle);
106var_dump( end($resources) );
107var_dump( current($resources) );
108
109echo "\n*** Testing error conditions ***\n";
110/* checking for unexpected number of arguments */
111var_dump( end() );
112var_dump( end($array[0], $array[0]) );
113
114/* checking for unexpected type of arguments */
115$var=1;
116$var1="string";
117var_dump( end($var) );
118var_dump( end($var1) );
119
120/* checking null array */
121$null_array = array();
122var_dump( end($null_array) );
123
124echo "Done\n";
125
126
127/* cleaning resource handles */
128fclose( $file_handle );  //file resource handle deleted
129closedir( $dir_handle );  //dir resource handle deleted
130
131?>
132--EXPECTF--
133*** Testing end() on different arrays ***
134-- Iteration 1 --
135int(0)
136int(0)
137-- Iteration 2 --
138int(100)
139int(100)
140-- Iteration 3 --
141string(1) "y"
142string(1) "y"
143-- Iteration 4 --
144NULL
145NULL
146-- Iteration 5 --
147int(5)
148int(5)
149-- Iteration 6 --
150float(-0.9)
151float(-0.9)
152-- Iteration 7 --
153float(-4.9999999)
154float(-4.9999999)
155-- Iteration 8 --
156bool(false)
157bool(false)
158-- Iteration 9 --
159string(3) "SOA"
160string(3) "SOA"
161-- Iteration 10 --
162array(0) {
163}
164array(0) {
165}
166-- Iteration 11 --
167string(0) ""
168string(0) ""
169-- Iteration 12 --
170string(1) " "
171string(1) " "
172-- Iteration 13 --
173float(-2147483648)
174float(-2147483648)
175-- Iteration 14 --
176float(-2147483648)
177float(-2147483648)
178-- Iteration 15 --
179float(2)
180float(2)
181
182*** Testing end() with sub-arrays ***
183array(3) {
184  [1]=>
185  string(3) "one"
186  ["two"]=>
187  int(2)
188  [""]=>
189  string(1) "f"
190}
191string(1) "f"
192
193*** Testing end() when array elements are deleted ***
194
195-- Remove first element from array --
196string(7) "neg.008"
197
198-- Remove last element from array --
199int(-4)
200int(-4)
201
202-- Remove any element from array apart from first and last element --
203int(-4)
204string(1) "b"
205int(-4)
206
207*** Testing end() on objects ***
208object(foo1)#%d (0) {
209}
210array(2) {
211  [0]=>
212  &object(foo)#%d (0) {
213  }
214  [1]=>
215  &object(foo1)#%d (0) {
216  }
217}
218
219*** Testing end() on resource type ***
220resource(%d) of type (stream)
221resource(%d) of type (stream)
222
223*** Testing error conditions ***
224
225Warning: end() expects exactly 1 parameter, 0 given in %s on line %d
226NULL
227
228Warning: end() expects exactly 1 parameter, 2 given in %s on line %d
229NULL
230
231Warning: end() expects parameter 1 to be array, int given in %s on line %d
232NULL
233
234Warning: end() expects parameter 1 to be array, string given in %s on line %d
235NULL
236bool(false)
237Done
238