Foros del Web » Programando para Internet » PHP »

reacomodar elementos de un arreglo multidimensional

Estas en el tema de reacomodar elementos de un arreglo multidimensional en el foro de PHP en Foros del Web. hola buen dia amigos! Son mis primeros trabajos con arreglos y necesito hacer un programita que me acomode los elementos de un arreglo multidimensional para ...
  #1 (permalink)  
Antiguo 19/04/2012, 18:09
 
Fecha de Ingreso: diciembre-2011
Mensajes: 90
Antigüedad: 12 años, 3 meses
Puntos: 0
reacomodar elementos de un arreglo multidimensional

hola buen dia amigos!

Son mis primeros trabajos con arreglos y necesito hacer un programita que me acomode los elementos de un arreglo multidimensional para que no se repitan en la misma fila, estos elementos pueden estar en cualquier posicion pero no repetirse en la misma fila.

muchas gracias por su ayuda...

un saludo
  #2 (permalink)  
Antiguo 19/04/2012, 21:43
Avatar de Raziel_Ravenheart  
Fecha de Ingreso: agosto-2011
Ubicación: Ibagué, Tolima
Mensajes: 192
Antigüedad: 12 años, 7 meses
Puntos: 37
Respuesta: reacomodar elementos de un arreglo multidimensional

Hola Yamsita, como estás?

Hay varias razones por las que es posible que nadie te haya respondido, aunque estoy totalmente seguro de que son estas:

1. Publicaste 2 veces la misma pregunta, eso va en contra de las reglas del foro. Tienes que ser paciente y publicarla solo una vez, aunque a veces uno lo hace por error.

2. Otra razón, es que la cultura de colaboración, llega a un límite y tu lo has cruzado. Te explico: Pareciera que estás pidiendo que te hagan el trabajo, y generalmente los foros son para que alguien te colabore, te guíe o te ayude, pero no que te hagan todo el trabajo.

Claro hay casos, y varios excepcionales donde encuentras un alma generosa que te colabore con lo que necesitas, si no lo ven complicado o es algo corto, pero ten en cuenta que la mayoría de personas expertas que surcan estos foros, son personas que por su experiencia tienen una vida laboral muy comprometida, o incluso también son estudiantes, pero tienen otras cosas que hacer.

Por eso para la próxima vez, te recomiendo que intentes hacerlo, y cuando llegues a un punto en el que no puedas continuar, pidas ayuda, mostrando todo lo que has hecho.

Ahora si prosigo a colaborarte, la primera pregunta que se me viene, es la siguiente: Y que pasa con los elementos duplicados?

Tienes el enunciado del ejercicio para que los escribas explícitamente acá, o así te lo pidieron? tal cual lo publicaste.
  #3 (permalink)  
Antiguo 20/04/2012, 08:35
 
Fecha de Ingreso: diciembre-2011
Mensajes: 90
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: reacomodar elementos de un arreglo multidimensional

hola!

Muchas gracias por tu comentario, si efectivamente lo publique dos veces por error y tienes razon en que debo intentarlo y despues preguntar, lo que paso fue que no sabia por donde empezar pero creo que no fue mi mejor redaccion de la consulta, muchas gracias.

Yo habia pensado hacerlo con if anidados, aunque el programa este un poco largo, y en respuesta a la primer pregunta es:
Los valores repetidos se deben acomodar en otra pocicion en la misa columna pero en diferente fila. así me lo pidieron...

muchas gracias por tu tiempo y amabilidad de respuesta

Última edición por yamsita; 20/04/2012 a las 09:34
  #4 (permalink)  
Antiguo 20/04/2012, 23:21
Avatar de Raziel_Ravenheart  
Fecha de Ingreso: agosto-2011
Ubicación: Ibagué, Tolima
Mensajes: 192
Antigüedad: 12 años, 7 meses
Puntos: 37
Exclamación Respuesta: reacomodar elementos de un arreglo multidimensional

Hola Yamsita, voy a tratar de responderte lo mejor que pueda, para empezar, voy a tratar de diseñar, lo que visualmente para nosotros sería un array bidimensional (multidimensional) o matriz, para el ejemplo voy a utilizar uno que sea 5x5, haciendo algunas suposiciones que tratarán de complementar algunas dudas que tengo al respecto, las cuales voy a señalar con rojo:

1. El array multidimensional nosotros lo veríamos de la siguiente manera

Código:
[5][4][6][5][8]
[7][3][8][9][8]
[4][5][ ][3][4]
[1][3][5][7][9]
[2][4][6][8][ ]
Mi primera suposición es que hay espacios vacíos, pero no en todas las filas, la segunda suposición es que un número no se repite más de dos veces en la fila y más de 5 veces en la matriz, de otro modo, se te puede estar complicando mucho el programa, por que este que es tan básico solo hará una pasada a toda la matriz, y después de eso, no volverá a revisar.

Por otro lado, al cambiarse un número de fila, pero dejarlo en la misma columna, primero toca asegurarnos que en esa fila no esté el mismo número y por otro lado tener en cuenta que, al cambiar el número de fila, el número que se encuentre en esa columna será sobreescrito y la posición antigua del número organizado quedará vacía. Todo esto se hace para lograr un código lo más simple posible.

Como se vería la anterior matríz en php:

Código PHP:
Ver original
  1. $matriz = array (
  2.     array( 5, 4, 6, 5, 8),
  3.     array( 7, 3, 8, 9, 8),
  4.     array( 4, 5, "", 3, 4),
  5.     array( 1, 3, 5, 7, 9),
  6.     array( 2, 4, 6, 8, "")
  7.  );

No te angusties por las comillas dobles seguidas, ya que estas solo significan que son una cadena de texto vacía. Aunque se supone que es una matriz numérica, en php, los arrays pueden llevar diferentes tipo de datos en sus posiciones.

Ahora, una parte del código, ten en cuenta que a pesar de poderse usar if, es mejor usar otra estructura: el foreach; aunque también se puede utilizar el for, pero es mejor utilizar el foreach, ya que este recorre todo el arreglo, sin necesidad de calcular su tamaño

Te dejo el enlace de como funciona el foreach.

Básicamente tenemos que ejecutar 2 foreach, el primero para recorrer cada posición del array principal, y el segundo para recorrer cada posición de los arrays internos, además de eso, tenemos que crear una función que nos ayude a buscar un número en una fila determinada. Esta función devuelve true, si el valor existe, y false en el caso contrario

Código PHP:
Ver original
  1. function buscarRepetido ( $matriz, $fila, $val ) {
  2.   $acumulador = 0;
  3.  
  4.   foreach ($matriz[ $fila ] as $num) {
  5.     if ($num == $valor) {
  6.       $acumulador++;
  7.     }
  8.   }
  9.  
  10.   if ($acumulador > 1) {
  11.     return true;
  12.   } else {
  13.     return false;
  14.   }
  15. }
  16.  
  17. function buscar ( $matriz, $fila, $valor ) {
  18.   foreach ($matriz[ $fila ] as $num) {
  19.     if ($num == $valor) {
  20.       return true;
  21.     }
  22.   }
  23.  
  24.   return false;
  25. }
  26.  
  27. $matriz = array (
  28.   array( 5, 4, 6, 5, 8),
  29.   array( 7, 3, 8, 9, 8),
  30.   array( 4, 5, "", 3, 4),
  31.   array( 1, 3, 5, 7, 9),
  32.   array( 2, 4, 6, 8, "")
  33.  );
  34.  
  35. $repetido = false;
  36. $con = 0;
  37. $tam = count( $matriz );
  38.  
  39. foreach ($matriz as $fila) {
  40.   foreach ($matriz as $pos=>$val) {
  41.     $repetido = buscarRepetido( $matriz, $fila, $val );
  42.    
  43.     if ($repetido) {
  44.       for($con = 0; $con < $tam; $con++) {
  45.         if ($con == $fila) {
  46.           continue;
  47.         } else {
  48.           $repetido = buscar( $matriz, $con, $val );
  49.          
  50.           if ($repetido == false) {
  51.             $matriz[$fila][$pos] = "";
  52.             $matriz[$con][$pos] = $val;
  53.             break;
  54.           }
  55.         }
  56.       }
  57.     }
  58.   }
  59. }

Trata de utilizar este código, la verdad lo escribí de memoria, estoy algo apurado por que voy de salida y no se si tenga errores, los cuales si hay, trata de arreglarlos, y te queda de tarea estudiar lo que no entiendas. Es obvio que este código se puede mejorar, pero por ahora espero que funcione bien, si tienes alguna duda, puedes preguntar, pero antes has todo lo posible por que funcione lo que te acabo de pasar

Saludos y éxitos

Última edición por Raziel_Ravenheart; 20/04/2012 a las 23:46 Razón: Complementar la respuesta
  #5 (permalink)  
Antiguo 22/04/2012, 08:54
 
Fecha de Ingreso: diciembre-2011
Mensajes: 90
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: reacomodar elementos de un arreglo multidimensional

Muchas gracias Raziel_Ravenheart, revisare el programa y agradezco tu ayuda, hay algunas condiciones extras que existen, pero te comparto el codigo cuando queden resueltas, por el momento fue una gran ayuda para seguir con este tema.

muchas gracias por tu amabilidad.

estare mostrandote mi codigo cuando corra completo, saludos!
  #6 (permalink)  
Antiguo 24/04/2012, 12:39
 
Fecha de Ingreso: diciembre-2011
Mensajes: 90
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: reacomodar elementos de un arreglo multidimensional

hola Raziel_Ravenheart!

Un gusto volver a saludarte... ya hice el codigo con algunas modificaciones y quedo asi:

Código PHP:
function buscar($valor$If$a){
    foreach(
$valor[$If] as $val){
        if (
$val==$a){
            return 
true;
            }
        }
            return 
false
    }
//verificamos que $Im siga siendo menor a $m=11;
for($Im=1$Im$m$Im++){
    
//verificamos que $In siga siendo igual a $n=6;
for($In=1$In$n$In++){
    
//asignamos el valor de ese elemeeto de la matriz a $a
      
$a $E_s_e[$Im][$In];
    
//verificamos si $a es igual o diferente de cero
 
if ($a){
          
//si $a es diferente de cero, nos ubicamos en la primer fila de esa misma columna
          //pero en la matriz destino
          
$If 1;
          
$Ic $In;
      }      
          
//si esa posicion de la matriz destino esta vacia
          
while($valor[$If][$Ic]==0){
          
$BUSCAR buscar($valor$If$a);
          if (
$BUSCAR == false){
              
$valor[$If][$Ic]=$a;
          }else{
              
$if++;            
              }    
            }
        
//}
    
}
}
          
//Proceso de impresion de la matriz $valor[][]
echo '<table border="1" align="center">';
    
$In=0;
foreach(
$valor as $clave => $arreglo){
    if(
$arreglo[$In]){
    
//    echo '<br/>Clave: '.$clave.' => Valor: '.$arreglo[$I_N];
        
echo '<tr>';
        echo 
'<td>'.$arreglo[$In].'</td>';
        
$In++;
        echo 
'<td>'.$arreglo[$In].'</td>';
        
$In++;
        echo 
'<td>'.$arreglo[$In].'</td>';
        
$In++;
        echo 
'<td>'.$arreglo[$In].'</td>';
        
$In++;
        echo 
'<td>'.$arreglo[$In].'</td>';
        
$In++;
        echo 
'<td>'.$arreglo[$In].'</td>';
        echo 
'</tr>';
        
$In=0;            
    }
}
echo 
'</table>';
echo 
'<br/><br/>'
El problema es que me dice que el tiempo estmado para la linea "$valor[$If][$Ic]=$a;" fue revasado y no corre el codigo, creo que el problema es que no hay un limite de busqueda en la matriz "destido ($valor)"... estoy en lo correcto?, y esi es asi, como creo una matriz con el mismo valor que la primera pero que este vacia, para ir llenandola con los elementos de la otra matriz?

espero me haya explicado agradezco tu yuda!

Saludos!
  #7 (permalink)  
Antiguo 26/04/2012, 08:49
 
Fecha de Ingreso: diciembre-2011
Mensajes: 90
Antigüedad: 12 años, 3 meses
Puntos: 0
Respuesta: reacomodar elementos de un arreglo multidimensional

bueno les comparto el codigo ya terminado...
muchas gracias por la orientacion...

Código PHP:

function buscar ($destino$If$a) {
   foreach(
$destino[$If] as $k => $igual){
        if(
$a == $igual){
        return 
true;
            } 
    }
}

 if (
$a!==0){
for(
$In=1$In<= $n$In++){
//asignamos el valor de ese elemeeto de la matriz a $a
  
$a $Ese[$Im][$In];
//si $a es diferente de cero, nos ubicamos en la primer fila de esa misma columna
//pero en la matriz destino
     
$Ic $In;
//si esa posicion de la matriz destino esta vacia
    
for($If=1;;$If++){
        if(!
$destino[$If][$Ic]){
        
$Busca buscar($destino$If$a);
        echo 
'<br/>Fila: '.$If.' Valor de $a: '.$a;
        if(
$Busca == false)
        {
    
$destino[$If][$Ic] = $a;
    break;
        }else{
}
    }
}

Saludos!

Etiquetas: elementos, multidimensional, arreglos
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 19:31.