Ver Mensaje Individual
  #14 (permalink)  
Antiguo 17/02/2010, 13:21
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 3 meses
Puntos: 260
Sonrisa Respuesta: Saber posicion en array - Complejo

Hola,

2. Parte.

Revisando mas detenidamente, en el concepto anterior hay un par de cosas en las que me equivoque, realmente solo lo escribí rapidamente, pero entrando un poco mas en detalle,

Lo pongo con CODE ... sino se mira desordenado ...

Código:
1. Ordenar el array, en el caso no estuviera ordenado.
2. Convertir cada elemento del array en un subarray, para generar una matriz, es decir, "0_0_0" se convierte en [0, 0, 0].

3. Ahora la función recursiva,
	Anteriormente mencioné pasar los valores por referencia, pero creo que es más adecuado, en este caso, devolver un array nuevo y reemplazar el anterior.
	Aunque pareciera que se puede usar foreach, array_walk o array_walk_recursive, yo optaría por un while con un acumulador (un indice $i = 0), que dá control sobre el índice del array o también current(), next(), prev().

	3.1 Primero crearía un array donde vamos a ir guardando los resultados $res, y un par de acumuladores.
	3.2 Ciclo : Mientras no me salga del array de datos...
		3.2.1 Guardo el valor actual del array de datos en un array temporal $previo, (por ejemplo el [0, 0, 0] en el primer ciclo).
		3.2.2 En el array de resultados $res, agrego un valor nuevo con el valor que guarde temporalmente $previo, pero uso de key y valor : "0_0_0" => "0_0_0" (Uso strings, ya no uso el array).
		3.2.3 Avanzo una posición en el array de datos.
		3.2.4 Ciclo : Mientras se cumpla lo siguiente ...
			No me salgo del array de datos y
			La cantidad de elementos del array anterior $previo sea menor que la cantidad de elementos del actual de datos,
			Los elementos del array anterior $previo son exactamente los mismos que una corte del array actual de datos de longitud igual al array anterior $previo.
				3.2.4.1 Guardo en el array de resultados $res un nuevo sub-array con los valores del array actual. "0_0_0" => [0, 0, 0] (El key es string y el valor un sub-array).
		3.2.5 Si es un array el valor actual en el array de resultados $res[ultimo ingresado]
			3.2.5.1 Reemplazo el valor actual en el array de resultados $res[ultimo ingresado] con una llamada a esta misma función recursiva, y de parámetros le envío el sub-array.
	3.3 Regreso el array de resultados $res.

4. Renumerar, función recursiva,
	Anteriormente mencione que se podía hacer en 2 pasos separados, renumerar y pasar a un array global, sería necesaro hacerlo solo en 1 paso,
	
	4.1 Inicial un acumulador y un array global,
	4.2 Pasar por todos los datos del array
		4.2.1 Agregar al array global, con su número, si es un array entrar de nuevo a esta funcion recursiva.
		4.2.2 Sino solamente agregar al array global.
		
5. Fin
¿Para qué usar los arrays inciales del paso 2?
Para agrupar, sino no creo que existe una forma de renumerar.

Saludos,