Ver Mensaje Individual
  #4 (permalink)  
Antiguo 20/04/2012, 23:21
Avatar de Raziel_Ravenheart
Raziel_Ravenheart
 
Fecha de Ingreso: agosto-2011
Ubicación: Ibagué, Tolima
Mensajes: 192
Antigüedad: 13 años, 3 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