1+ <?php
2+ /**
3+ * Demostración de diferentes mecanismos de iteración en PHP
4+ *
5+ * PHP ofrece múltiples formas de realizar iteraciones, cada una
6+ * con sus propias características y casos de uso específicos.
7+ */
8+
9+ echo "=== Demostración de Mecanismos de Iteración en PHP === \n\n" ;
10+
11+ // 1. Bucle for tradicional
12+ echo "1. Usando bucle for tradicional: \n" ;
13+ /*
14+ * El bucle for es uno de los más comunes y versátiles.
15+ * Sintaxis: for (inicialización; condición; incremento)
16+ */
17+ for ($ i = 1 ; $ i <= 10 ; $ i ++) {
18+ echo $ i . " " ;
19+ }
20+ echo "\n\n" ;
21+
22+ // 2. Bucle while
23+ echo "2. Usando bucle while: \n" ;
24+ /*
25+ * El bucle while se ejecuta mientras una condición sea verdadera.
26+ * Es útil cuando no sabemos exactamente cuántas iteraciones necesitamos.
27+ */
28+ $ contador = 1 ;
29+ while ($ contador <= 10 ) {
30+ echo $ contador . " " ;
31+ $ contador ++;
32+ }
33+ echo "\n\n" ;
34+
35+ // 3. Bucle do-while
36+ echo "3. Usando bucle do-while: \n" ;
37+ /*
38+ * Similar al while, pero garantiza que el código se ejecute al menos una vez
39+ * ya que la condición se evalúa al final de cada iteración.
40+ */
41+ $ num = 1 ;
42+ do {
43+ echo $ num . " " ;
44+ $ num ++;
45+ } while ($ num <= 10 );
46+ echo "\n\n" ;
47+
48+ // EXTRA: Más mecanismos de iteración
49+
50+ // 4. foreach con array
51+ echo "4. Usando foreach con array: \n" ;
52+ /*
53+ * foreach es especialmente útil para iterar sobre arrays y objetos.
54+ * Es muy legible y evita tener que manejar índices manualmente.
55+ */
56+ $ numeros = range (1 , 10 );
57+ foreach ($ numeros as $ numero ) {
58+ echo $ numero . " " ;
59+ }
60+ echo "\n\n" ;
61+
62+ // 5. array_map
63+ echo "5. Usando array_map: \n" ;
64+ /*
65+ * array_map aplica una función a cada elemento de un array.
66+ * Es útil para transformar datos de forma funcional.
67+ */
68+ $ resultado = array_map (function ($ n ) {
69+ echo $ n . " " ;
70+ return $ n ;
71+ }, range (1 , 10 ));
72+ echo "\n\n" ;
73+
74+ // 6. array_walk
75+ echo "6. Usando array_walk: \n" ;
76+ /*
77+ * array_walk es similar a array_map, pero modifica el array original
78+ * y permite pasar parámetros adicionales a la función de callback.
79+ */
80+ array_walk ($ numeros , function ($ valor ) {
81+ echo $ valor . " " ;
82+ });
83+ echo "\n\n" ;
84+
85+ // 7. Iterator
86+ echo "7. Usando Iterator: \n" ;
87+ /*
88+ * PHP proporciona varias clases de iterador para manejar colecciones
89+ * de manera más orientada a objetos.
90+ */
91+ $ arrayIterator = new ArrayIterator ($ numeros );
92+ while ($ arrayIterator ->valid ()) {
93+ echo $ arrayIterator ->current () . " " ;
94+ $ arrayIterator ->next ();
95+ }
96+ echo "\n\n" ;
97+
98+ // 8. Generator
99+ echo "8. Usando Generator: \n" ;
100+ /*
101+ * Los generadores permiten crear iteradores de forma simple y eficiente
102+ * sin necesidad de implementar la interfaz completa de Iterator.
103+ */
104+ function generarNumeros () {
105+ for ($ i = 1 ; $ i <= 10 ; $ i ++) {
106+ yield $ i ;
107+ }
108+ }
109+
110+ foreach (generarNumeros () as $ numero ) {
111+ echo $ numero . " " ;
112+ }
113+ echo "\n\n" ;
114+
115+ // 9. array_reduce
116+ echo "9. Usando array_reduce: \n" ;
117+ /*
118+ * Aunque array_reduce se usa principalmente para reducir un array a un solo valor,
119+ * también puede usarse para iterar realizando una acción en cada paso.
120+ */
121+ array_reduce ($ numeros , function ($ carry , $ item ) {
122+ echo $ item . " " ;
123+ return $ carry ;
124+ });
125+ echo "\n\n" ;
126+
127+ // 10. SPL DirectoryIterator (ejemplo con números)
128+ echo "10. Usando SPL DirectoryIterator (simulado con números): \n" ;
129+ /*
130+ * PHP proporciona iteradores especializados para diferentes propósitos.
131+ * Aquí simulamos uno similar a DirectoryIterator pero con números.
132+ */
133+ class NumberIterator implements Iterator {
134+ private $ position = 0 ;
135+ private $ array = [];
136+
137+ public function __construct () {
138+ $ this ->array = range (1 , 10 );
139+ }
140+
141+ public function rewind () {
142+ $ this ->position = 0 ;
143+ }
144+
145+ public function current () {
146+ return $ this ->array [$ this ->position ];
147+ }
148+
149+ public function key () {
150+ return $ this ->position ;
151+ }
152+
153+ public function next () {
154+ ++$ this ->position ;
155+ }
156+
157+ public function valid () {
158+ return isset ($ this ->array [$ this ->position ]);
159+ }
160+ }
161+
162+ $ numberIterator = new NumberIterator ();
163+ foreach ($ numberIterator as $ number ) {
164+ echo $ number . " " ;
165+ }
166+ echo "\n\n" ;
167+
168+ echo "=== Fin de la demostración === \n" ;
169+ ?>
0 commit comments