Foros del Web » Programando para Internet » PHP »

Saber posicion en array - Complejo

Estas en el tema de Saber posicion en array - Complejo en el foro de PHP en Foros del Web. Hola foreros!, Vereis tengo un problema bastante chungo, por eso lo de complejo. Tengo un array con un monton de variables, las cuales tienen una ...
  #1 (permalink)  
Antiguo 12/02/2010, 01:06
Avatar de salbatore  
Fecha de Ingreso: abril-2007
Ubicación: Springfield
Mensajes: 1.567
Antigüedad: 17 años
Puntos: 19
Saber posicion en array - Complejo

Hola foreros!,

Vereis tengo un problema bastante chungo, por eso lo de complejo. Tengo un array con un monton de variables, las cuales tienen una estructura como la siguiente:
Código PHP:
$orden[0]="0_0_0";
$orden[1]="0_1_0";
$orden[2]="1_0_0";
$orden[3]="2";
$orden[4]="2_0_5";
$orden[5]="2_0_6";
$orden[6]="5";
$orden[7]="5_2"
Lo que estoy intentado hacer y me esta volviendo tarumba es saber cual es la posicion por ejemplo del elemento 7. El dato que me deberia arrojar es: 4,1. Es decir, lo que necesito es que cuente de este modo:

Código PHP:
$orden[0]="0_0_0"; --> Como no existe el elemento "0" o el "0_0" este el nº 0.
$orden
[1]="0_1_0"; --> Como no existe el elemento "0" o el "0_1" este el nº 1.
$orden
[2]="1_0_0"; --> Como no existe el elemento "1" o el "1_0" este el nº 2.
$orden
[3]="2"; --> Este el nº 3.
$orden
[4]="2_0_5"; --> Como existe el elemento "2" este es el nº 3.1.
$orden[5]="2_0_6"; --> Como existe el elemento "2" este es el nº 3.2.
$orden[6]="5"; --> Este es el nº 4.
$orden
[7]="5_2"; --> Como existe el elemento "5" este es el nº 4,1. 
Creo que se entiende, jeje. Lo que busco es saber la posicion de cada elemento de ese modo, se que es dificil de realizar, pero creo que se comprende la idea perfectamente.

¿Me podeis hechar una mano?
  #2 (permalink)  
Antiguo 12/02/2010, 01:33
Avatar de maturano  
Fecha de Ingreso: enero-2010
Ubicación: /home/
Mensajes: 537
Antigüedad: 14 años, 3 meses
Puntos: 36
Respuesta: Saber posicion en array - Complejo

Decía: Tienes el algoritmo, puedes hacerlo utilizando explode() e in_array(). Inténtalo, si tienes problemas, menciónalos.

www.php.net/explode
www.php.net/in_array
__________________
I ♥ The Music!

Última edición por maturano; 12/02/2010 a las 01:41
  #3 (permalink)  
Antiguo 12/02/2010, 01:54
Avatar de salbatore  
Fecha de Ingreso: abril-2007
Ubicación: Springfield
Mensajes: 1.567
Antigüedad: 17 años
Puntos: 19
Respuesta: Saber posicion en array - Complejo

Hola de nuevo!

La verdad es que se me habia olvidado poner un poco lo que ya habia intentado hacer, jeje... Conozco bastante la explode y cuando he intentado hacer el codigo que necesito siempre tiro de ella para comparar posiciones, jeje.

Pero mi problema iba mas orientado al planteamiento de las funciones, pues hasta ahora he probado haciendo bucles ayudado de algunas funciones para comprobar posiciones en las variables pero no soy capaz, jeje... me es muy complejo.

No quiero el codigo hecho... ya que realmente me muevo bien con el PHP, lo que necesitaba es un planteamiento para desarrollar la idea... pues no se ni por donde cogerlo, jeje. Es que las funciones recursivas me vuelven loco de remate!.

Asi que... ¿a alguien se le ocurre como atacar a mi problema?
  #4 (permalink)  
Antiguo 12/02/2010, 08:45
Avatar de jackson666  
Fecha de Ingreso: noviembre-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 1.971
Antigüedad: 14 años, 5 meses
Puntos: 65
Respuesta: Saber posicion en array - Complejo

O el problema es muy simple de resolver o yo no entendi nada...

Código PHP:
<?php
$orden
[0]="0_0_0"
$orden[1]="0_1_0"
$orden[2]="1_0_0"
$orden[3]="2"
$orden[4]="2_0_5"
$orden[5]="2_0_6"
$orden[6]="5"
$orden[7]="5_2";


function 
getPosicion($item){

$patron = array(
                
'0_0_0' => 0,
                
'0_1_0' => 1,
                
'1_0_0' => 2
                
'2' => 3,
                
'2_0_5' => 3.1,
                
'2_0_6' => 3.2,
                
'5' => 4,
                
'5_2' => 4.1
                
);

foreach(
$patron as $key => $val){
    
    if(
$item == $key){
        echo 
'<br />La posicion de '.$key.' es '.$val.'<br />';
        break;        
    }
}
}

# Para usarlo
foreach($orden as $val){
    
getPosicion($val);
}
?>
__________________
HV Studio
Diseño y desarrollo web
  #5 (permalink)  
Antiguo 12/02/2010, 09:00
Avatar de salbatore  
Fecha de Ingreso: abril-2007
Ubicación: Springfield
Mensajes: 1.567
Antigüedad: 17 años
Puntos: 19
Respuesta: Saber posicion en array - Complejo

Hola de nuevo...

No no, jeje... jackson666. Seria tirado hacerlo asi. Lo necesito hacer sabiendo solamente el nombre de las variables. La posicion la debo descubrir por medio del nombre de la variable. Si te fijas su posicion esta determina por el nombre de su variable. El problema que tengo es que no se hacer una funcion que interprete del modo en el que en el primer mensaje explico el nombre de las variables. Es decir, lo que yo necesito es sacar la posicion solo haciendo uso del nombre de las variables.

¿Me explico mal?, jeje... la verdad es que despues de estar varias horas intentandolo nada, jeje... me parece complicadisomo!. Aunque cruzo los dedos en que un experto en funciones recursivas!... de todos modos muchas gracias por la ayuda jackson666...

¿Se os ocurre una solucion?
  #6 (permalink)  
Antiguo 12/02/2010, 09:05
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años
Puntos: 839
Respuesta: Saber posicion en array - Complejo

Hay algo que no me quedó claro del ejemplo en el primer mensaje, ¿No debería $orden[1] ser 1.1?
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #7 (permalink)  
Antiguo 12/02/2010, 09:09
Avatar de jackson666  
Fecha de Ingreso: noviembre-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 1.971
Antigüedad: 14 años, 5 meses
Puntos: 65
Respuesta: Saber posicion en array - Complejo

Es que tenes que hallar un patron para eso, encontrarle una logica... No es que "un experto en funciones" te va a hacer magia y resolverlo.

Porque simplemente no pasas a codigo las afirmaciones que haces aqui?

Código PHP:
$orden[0]="0_0_0"; --> Como no existe el elemento "0" o el "0_0" este el n 0. 
$orden
[1]="0_1_0"; --> Como no existe el elemento "0" o el "0_1" este el n 1. 
$orden
[2]="1_0_0"; --> Como no existe el elemento "1" o el "1_0" este el n 2. 
$orden
[3]="2"; --> Este el n 3. 
$orden
[4]="2_0_5"; --> Como existe el elemento "2" este es el n 3.1
$orden[5]="2_0_6"; --> Como existe el elemento "2" este es el n 3.2
$orden[6]="5"; --> Este es el n 4. 
$orden
[7]="5_2"; --> Como existe el elemento "5" este es el n 4,1. 
__________________
HV Studio
Diseño y desarrollo web
  #8 (permalink)  
Antiguo 12/02/2010, 12:07
Avatar de salbatore  
Fecha de Ingreso: abril-2007
Ubicación: Springfield
Mensajes: 1.567
Antigüedad: 17 años
Puntos: 19
Respuesta: Saber posicion en array - Complejo

Hola de nuevo!,

David!, el $orden[1] debe ser nº 1, pues si te fijas no tiene padre, es decir, no tiene ningun elemento superior, no tiene padre. El elemento $orden[0] si te fijas es su primo. Asi que los numeros que he puesto en la parte superior son correctos, jeje.

jackson666!, la verdad es que si no pensase que alguien con mas capacidad que yo podria ayudarme a resolverlo no lo preguntaria, jeje. De todos modos ese "Porque simplemente no pasas a codigo las afirmaciones que haces aqui?" para mi eso esta a años luz. Y seguramente con algun consejo de algun sabio en funciones recursivas me pueda hacer un croquis, jeje.

Bueno, pues eso, ya se palpa mi desesperacion... :P

¿Alguien da mas, jeje?


PD: bueno... supongo que es evidente que el nombre de las variables puede ser tan largo como se desee... 0_0_0_8_0_1_2_3... pues sino seria sencillo con explode unas cuantas veces... jeje.

Última edición por salbatore; 12/02/2010 a las 12:16
  #9 (permalink)  
Antiguo 12/02/2010, 13:27
Avatar de maturano  
Fecha de Ingreso: enero-2010
Ubicación: /home/
Mensajes: 537
Antigüedad: 14 años, 3 meses
Puntos: 36
Respuesta: Saber posicion en array - Complejo

Cita:
Iniciado por David Ver Mensaje
Hay algo que no me quedó claro del ejemplo en el primer mensaje, ¿No debería $orden[1] ser 1.1?
Por la coincidencia del '0_' ¿verdad?. Lo mismo entendí, pero "quién sabe"

Cita:
Iniciado por salbatore Ver Mensaje
Y seguramente con algun consejo de algun sabio en funciones recursivas me pueda hacer un croquis, jeje.
¿Funciones recursivas para qué?. A como lo estoy entendiendo, solo es un explode(), recorrer el resultado (un ciclo) con una condicional dentro (in_array()).

Diagrama de flujo es lo que tienes que hacer. Nuevamente, muestra lo que tienes, plantea tus problemas. Tampoco entiendo qué quieras se te diga (porque, gracias, afirmas no quieres el trabajo hecho).

¿Mi consejo?. Crea tu diagrama de flujo con seudo-código.
__________________
I ♥ The Music!
  #10 (permalink)  
Antiguo 13/02/2010, 17:01
Avatar de salbatore  
Fecha de Ingreso: abril-2007
Ubicación: Springfield
Mensajes: 1.567
Antigüedad: 17 años
Puntos: 19
Respuesta: Saber posicion en array - Complejo

Hola de nuevo...

Jeje, bueno visto lo visto, jeje... dentro de unos dias planteo lo que he hecho, aunque ya me veo con problemas... ya os contare en dos dias!.

Hasta pronto!.
  #11 (permalink)  
Antiguo 13/02/2010, 18:57
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Saber posicion en array - Complejo

Hola,

Posiblemente ...
Yo lo haría así, aunque posiblemente exista una forma más simple,

Código PHP:
$orden[0]="0_0_0"
$orden[1]="0_1_0"
$orden[2]="1_0_0"
$orden[3]="2"
$orden[4]="2_0_5"
$orden[5]="2_0_6"
$orden[6]="5"
$orden[7]="5_2";  
$orden[8]="6"
$orden[9]="6_1"
$orden[10]="6_1_0"
$orden[11]="6_1_1"
$orden[12]="6_2_0"
1. sort()

2. array's

Código PHP:
$data =>
    
$orden[0] => [000]
    
$orden[1] => [010]
    [
100]
    [
2]
    [
205]
    [
206]
    [
5]
    [
52]
    [
6]
    [
61]
    [
610]
    [
611]
    [
620
3. first pass - recursive
Mover todos los que coincidan en el nivel 1.
Barrer el array, todos los que coincidan con un nivel superior (1 elemento) moverlos hacia adentro sub-array.

Código PHP:
[000]
[
010]
[
100]
[
2] =>
    [
205]
    [
206]
[
5] =>
    [
52]
[
6] =>
    [
61]
    [
610]
    [
611]
    [
620
4. second pass
Mover todos los que coincidan en el nivel 2.
Esta es la parte recursiva, entra en la misma función anterior, pero solamente pasa como parámetros el sub-array, pasar por referencia.
Ya no verifica igualdad de 1 elemento, sino 2.

Código PHP:
[000]
[
010]
[
100]
[
2] =>
    [
205]
    [
206]
[
5] =>
    [
52]
[
6] =>
    [
61] =>
        [
610]
        [
611]
    [
620
5. Repetir con los demás niveles
La misma operación recursiva, solamente pasa el sub-array por referencia.
Ya no verifica igualdad de 2 elementos, sino 3.

6. Renumerar - recursiva

Código PHP:
[000] / 0
[010] / 1
[100] / 2
[2] => / 3
    
[205] / 3.1
    
[206] / 3.2
[5] => / 4
    
[52] / 4.1
[6] => / 5
    
[61] => / 5.1
        
[610] / 5.1.1
        
[611] / 5.1.2
    
[620] / 5.2 
7. Posiblemente extraer a un nuevo array plano; barrer recursivamente y agregar al final de un array global.

Saludos,
  #12 (permalink)  
Antiguo 17/02/2010, 10:57
Avatar de salbatore  
Fecha de Ingreso: abril-2007
Ubicación: Springfield
Mensajes: 1.567
Antigüedad: 17 años
Puntos: 19
Respuesta: Saber posicion en array - Complejo

Hola de nuevo a todos,

Tras pensar y pensar... y es que ya no es problema de saber PHP, ya es parte de la vida, juas juas... este problema se me esta acercando peligrosamente a la filosofia que me daban en el colegio, asi que estos dias he pensado en ir a preguntar al cura... pero no creo que me pueda ayudar asi que aqui estoy.

HackmanC es eso en realidad lo que desearia hacer, pero no tengo ni idea de como hacerlo!... jeje... es que el problema lo tengo en como escribir esas funciones y demas...

Os pongo el codigo que he escrito, espero que no dudeis en que soy un inutil, ya os lo digo yo!. No tengo ni idea de como hacerlo, el codigo que os posteo lo demuestra, no es basicamente basura, sino que dice gritando!... este forero no tiene ni * de idea de programar, lo se, jeje... :

Código PHP:
<?php
        
//el array con los elementos:
            
$el_array[0]="0_0_0";     //posicion 0
            
$el_array[1]="0_1_0";     //posicion 1
            
$el_array[2]="1_0_0";     //posicion 2
            
$el_array[3]="2";        //posicion 3
            
$el_array[4]="2_0_5";     //posicion 3.1
            
$el_array[5]="2_0_6";     //posicion 3.2
            
$el_array[6]="5";         //posicion 4
            
$el_array[7]="5_2";     //posicion 4.1
        //los elementos siempre llegan ordenador.
        
        //ahora sabremos su posicion los elementos:
            
echo "Inicio de la ordenacion de las variables<hr/>";
        
//pensamientos:
            // - Es posible que falten elementos entre ellos.
            // - Pueden tener hermanos
            // - Pueden ser huerfanos de padre, pero pueden tener abuelos...
            
        
for($el_array_i=0;$el_array_i<count($el_array);$el_array_i++)
            {
                
//variables
                    
$el_array_explode=explode('_',$el_array[$el_array_i]);
                    
detective();
                
                
//introducimos su posicion en un nuevo array:
                     
$el_array_posicion[$el_array_i]='';
                echo 
'<hr/>';
            }
        
        function 
detective()
            {
                
//debemos saber si existe un elemento 
                
echo "investigando si tiene un elemento superior... no se ni que hacer en esta funcion!";
            }
    
?>
Disculpar el codigo que os he puesto, ya se que es como si no huviese hecho nada, pero es que realmente no tengo ni idea por donde coger este problema .

¿Que pensais?
  #13 (permalink)  
Antiguo 17/02/2010, 13:19
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Saber posicion en array - Complejo

Hola,

Perdón por haberme adelantado un poquito ... (aunque no estaba seguro si ibas a continuar, por eso no lo había mostrado) ... lo divido en 3 partes ...

1. Parte.

Unas cuantas correcciones que encontré analizandolo un poco más detenidamente,

Cita:
Iniciado por HackmanC Ver Mensaje
Código PHP:
$orden[0]="0_0_0"
$orden[1]="0_1_0"
$orden[2]="1_0_0"
$orden[3]="2"
$orden[4]="2_0_5"
$orden[5]="2_0_6"
$orden[6]="5"
$orden[7]="5_2";  
$orden[8]="6"
$orden[9]="6_1"
$orden[10]="6_1_0"
$orden[11]="6_1_1"
$orden[12]="6_2_0"
Yo agregué mas elementos al final porque me pareció que al ejemplo que pusiste le hacían falta,
Al ver bien los datos, ¿Que debería pasar al desaparecer el $orden[8]="6"?, es algo que tienes que tomar en cuenta y no había contemplado anteriormente.

Cita:
Iniciado por HackmanC Ver Mensaje
3. first pass - recursive
Mover todos los que coincidan en el nivel 1.
Barrer el array, todos los que coincidan con un nivel superior (1 elemento) moverlos hacia adentro sub-array.
Aquí hay un error, no podría ser 1 elemento (por el motivo anterior), tendría que ser 'todos los que coincida exactamente en la misma cantidad de elementos con el anterior'.
Y lo de moverlos suena complicado, mejor sería crear un nuevo array temporal donde se van copiando y agregando, y es lo que devuelve la función recursiva.

Cita:
Iniciado por HackmanC Ver Mensaje
4. second pass
Mover todos los que coincidan en el nivel 2.
Esta es la parte recursiva, entra en la misma función anterior, pero solamente pasa como parámetros el sub-array, pasar por referencia.
Ya no verifica igualdad de 1 elemento, sino 2.
También el mismo error anterior, no verifica 2 elementos, verifica 'todos los elementos que coincidan exactamente con el nivel superior'.
Como devuelve un array temporal no es necesario pasar por referencia.

Cita:
Iniciado por HackmanC Ver Mensaje
6. Renumerar - recursiva
7. Posiblemente extraer a un nuevo array plano; barrer recursivamente y agregar al final de un array global.
Esta operación sería adecuado realizarla de una sola pasada recursivamente, no 2 funciones diferentes.

Saludos,
  #14 (permalink)  
Antiguo 17/02/2010, 13:21
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 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,
  #15 (permalink)  
Antiguo 17/02/2010, 13:27
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Saber posicion en array - Complejo

Hola,

Seguramente es aburrido leer lo anterior, pero pensé que querias desarrollar el código personalemnte, así que solo te pongo una parte ... para que entres en los detalles ...

Código PHP:
$data = array(
"0_0_0",
"0_1_0",
"1_0_0",
"2",
"2_0_5",
"2_0_6",
"5",
"5_2",
"6",
"6_1_0",
"6_1_1",
"6_2_0"
);
$done = array();

sort($dataSORT_STRING);
foreach (
$data as &$d)
    
$d explode('_'$d);

$data walk($data1);
renum($data'P');

print_r($done); 
La función walk es relativamente sencilla ... te muestro la primera parte ... si deseas que ponga el código completo no hay problema .. aunque posiblemente algunos por aquí me vayan a regañar ... es broma

Código PHP:
function walk($subdata) {
    
$tree = array();
    
$i 0$j count($subdata);

    while (
$i $j) {
        
$prev $subdata[$i++];
        
$label implode('_'$prev);
        
$tree[$label] = $label;
        while (
                
$i $j &&
                
count($prev) < count($subdata[$i]) &&
                
$prev === array_slice($subdata[$i], 0count($prev))) {
...
9 lineas más ...

Saludos,
  #16 (permalink)  
Antiguo 18/02/2010, 05:49
Avatar de salbatore  
Fecha de Ingreso: abril-2007
Ubicación: Springfield
Mensajes: 1.567
Antigüedad: 17 años
Puntos: 19
Respuesta: Saber posicion en array - Complejo

Hola HackmanC,

Pues espero que no te regañen, pero mi dominio del PHP no estan elevado como pensaba, jeje... Llevo varias horas intentado hacer algo con el codigo que me mandaste... pero no se... hasta con mi hermano mayor!... pero no hay forma.

Es que no se que me ocurre... pero se me hace enorme el problema... la cabeza deja de comprender con tanto bucle... recursiones... buff...

De... "una pequeña ayuda a enteder el problema" a "dame la solucion"... de eso he pasado....

Pues... como decir esto para no parecer un macro gorron... pues...

¿Te importaria darme el resto de la funcion? .

Creo que tras este problema... ya todo me va a parecer tirado... llegare a los 60 comparando todo lo dificil con "ese problema que tuve de joven con un bucle"... jeje.
  #17 (permalink)  
Antiguo 18/02/2010, 08:43
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Saber posicion en array - Complejo

Hola,

No hay problema, y para ser sincero, llevo muchos años programando y este tipo de algoritmos realmente son dificiles de comprender, posiblemente todavía tenga algunos errores porque no lo probé extensamente,

Código PHP:
<?php

function walk($subdata) {
    
$tree = array();
    
$i 0$j count($subdata);

    while (
$i $j) {
        
$prev $subdata[$i++];
        
$label implode('_'$prev);
        
$tree[$label] = $label;
        while (
                
$i $j &&
                
count($prev) < count($subdata[$i]) &&
                
$prev === array_slice($subdata[$i], 0count($prev))) {
            if (!
is_array($tree[$label]))
                
$tree[$label] = array();
            
$tree[$label][] = $subdata[$i++];
        }
        if (
is_array($tree[$label]))
            
$tree[$label] = walk($tree[$label]);
    }

    return 
$tree;
}

function 
renum($subdata$prev) {
    global 
$done$i 0;
    foreach (
$subdata as $k => $s) {
        
$label $prev '.' $i++;
        if (
is_array($s)) {
            
$done[] = $k ' => ' $label;
            
renum($s$label);
        } else {
            
$done[] = $s ' => ' $label;
        }
    }
}

$data = array(
"0_0_0",
"0_1_0",
"1_0_0",
"2",
"2_0_5",
"2_0_6",
"5",
"5_2",
"6",
"6_1_0",
"6_1_1",
"6_2_0"
);
$done = array();

sort($dataSORT_STRING);
foreach (
$data as &$d)
    
$d explode('_'$d);

$data walk($data);
renum($data'P');

print_r($done);

?>
Saludos,
  #18 (permalink)  
Antiguo 18/02/2010, 09:29
Avatar de salbatore  
Fecha de Ingreso: abril-2007
Ubicación: Springfield
Mensajes: 1.567
Antigüedad: 17 años
Puntos: 19
Respuesta: Saber posicion en array - Complejo

Hola HackmanC,

Ya la he probado y funciona fantastico!, jeje. Ahora lo que me toca es aprender como esta hecha, jeje... viendo codigo como el tuyo algunas veces me pregunto si se PHP, no es broma. Yo siempre con mis if, else y for... estoy tan pancho... pero luego veo codigo como el tuyo y pufff... pequeño y maton. El mio es grande y tonto. Que envidia!.

Pienso pasarle por la face a mi hermano el codigo... tanto boli y papel... como los profes... pero luego!... jamones!.

Muchas gracias HackmanC...

Hasta pronto!... espero que alguna vez te pueda ayudar en alguna cosa!... aunque sinceramente... no nos engañemos no sera en PHP, jeje.
  #19 (permalink)  
Antiguo 18/02/2010, 09:56
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Saber posicion en array - Complejo

Cita:
Iniciado por salbatore Ver Mensaje
... Ahora lo que me toca es aprender como esta hecha, jeje...
Exacto, la idea de poner el algoritmo y el código es para que puedas darte una idea de como resolver este tipo de problemas, el algoritmo lo modifiqué varias veces, no es que haya salido a la primera.

Cita:
Iniciado por salbatore Ver Mensaje
... viendo codigo como el tuyo algunas veces me pregunto si se PHP, no es broma. Yo siempre con mis if, else y for... estoy tan pancho...
Bueno, pero no creas que nací sabiendo hacerlo; me tomó mucho tiempo y esfuerzo llegar a escribir ese tipo de codigo (que no forzosamente es el mejor), así también pregunté muuuuucho a mucha gente y me ayudaron en su momento.

Cita:
Iniciado por salbatore Ver Mensaje
... Pienso pasarle por la face a mi hermano el codigo... tanto boli y papel... como los profes... pero luego!... jamones!. ...
Je, je ... siempre hay alguien mejor que uno; si encuentras otra implementación para resolver el mismo problema me gustaría mucho verla, eso me da perspectiva, porque posiblemente exista una forma más simple de resolverlo.

Saludos.

Etiquetas: posicion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:32.