Foros del Web » Programando para Internet » PHP »

ordenar array segun clave de otro...

Estas en el tema de ordenar array segun clave de otro... en el foro de PHP en Foros del Web. Hola, he estado buscando información sobre las funciones para ordenar arrays pero creo que ninguna me sirve para mi propósito o no sé como utilizarlas... ...
  #1 (permalink)  
Antiguo 12/12/2005, 06:57
 
Fecha de Ingreso: octubre-2004
Ubicación: Cork (Irlanda)
Mensajes: 161
Antigüedad: 12 años, 1 mes
Puntos: 1
ordenar array segun clave de otro...

Hola, he estado buscando información sobre las funciones para ordenar arrays pero creo que ninguna me sirve para mi propósito o no sé como utilizarlas...

Explico mi problema mediante un ejemplo.

Tengo dos arrays:

Código:
$arr1 => array(4) { [0]=> array(2) { ["ID"]=>  int(1)
                                     ["PT"]=>  int(2)
                                     ["DF"]=>  int(4) }
                    [1]=> array(2) { ["ID"]=>  int(2)
                                     ["PT"]=>  int(2)
                                     ["DF"]=>  int(8) }
                    [2]=> array(2) { ["ID"]=>  int(3)
                                     ["PT"]=>  int(1)
                                     ["DF"]=>  int(-2) }
                    [3]=> array(2) { ["ID"]=>  int(4)
                                     ["PT"]=>  int(1)
                                     ["DF"]=>  int(-1) } }

$arr2 => array(4) { [0]=> array(2) { ["ID"]=> int(4)
                                     ["PT"]=> int(0)
                                     ["DF"]=> int(-1) }
                    [1]=> array(2) { ["ID"]=> int(3)
                                     ["PT"]=> int(1)
                                     ["DF"]=> int(5) }
                    [2]=> array(2) { ["ID"]=> int(2)
                                     ["PT"]=> int(0)
                                     ["DF"]=> int(-2) }
                    [3]=> array(2) { ["ID"]=> int(1)
                                     ["PT"]=> int(1)
                                     ["DF"]=> int(8) } }
Los represento de otra forma por si queda más claro:
Código:
$arr1:               $arr2:

 ID | PT | DF         ID | PT | DF
--------------       ---------------
  1 |  2 |  4          4 |  0 | -1
  2 |  2 |  8          3 |  1 |  5
  3 |  1 | -2          2 |  0 | -2
  4 |  1 | -1          1 |  1 |  8
Lo que quiero hacer es lo siguiente: recolocar las filas de $arr1 en el orden que aparece un atributo concreto de $arr2. Es decir, en este caso el atributo concreto quiero que sea ID, entonces quiero que $arr1 se reordene para quedar así:

Código:
 ID | PT | DF
--------------
  4 |  1 | -1
  3 |  1 | -2
  2 |  2 |  8
  1 |  2 |  4
Supongo que con esta explicación se entiende.

¿Alguien sabría como utilizar alguna función existente en php para realizar esto? ¿o tendré que construirme una a mano?

Gracias!
  #2 (permalink)  
Antiguo 12/12/2005, 16:10
 
Fecha de Ingreso: octubre-2004
Ubicación: Cork (Irlanda)
Mensajes: 161
Antigüedad: 12 años, 1 mes
Puntos: 1
Bueno, al final hice una función propia para resolver el problema...
  #3 (permalink)  
Antiguo 12/12/2005, 16:25
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 11 años, 5 meses
Puntos: 2
Cita:
Iniciado por masterjail
Bueno, al final hice una función propia para resolver el problema...
Seria bueno que postees la solución, por si alguna persona se encuentra en la misma situación que tu no tenga muchas complicaciones al resolverlo, de otra forma este seria un thread huerfano.

Saludos y suerte.
  #4 (permalink)  
Antiguo 13/12/2005, 07:37
 
Fecha de Ingreso: octubre-2004
Ubicación: Cork (Irlanda)
Mensajes: 161
Antigüedad: 12 años, 1 mes
Puntos: 1
Código:
//---------------------------------------------------------------------------------------------//
// Ordena un array respecto la posición que ocupa un valor de una clave en otro array.         //
// Los dos arrays deben tener la misma clave y, además, sus valores no pueden estar repetidos. //
//---------------------------------------------------------------------------------------------//
// - $desordenado: array a ordenar.                                                            //
// - $ordenado   : array a partir del cual ordenaremos el desordenado.                         //
// - $clave      : clave del array ordenado a partir de la cual ordenar el desordenado.        //
//---------------------------------------------------------------------------------------------//
function ordenar($desordenado,$ordenado,$clave){

  // creamos un array en donde formaremos el resultado:
  $reordenado = Array();

  // recorremos el array ordenado:
  foreach ($ordenado as $k => $v){

    // tomamos el valor que hay en la clave especificada:
    $valor = $v[$clave];

    // buscamos este valor en el array desordenado:
    $pos = 0;
    $encontrado = false;
    while (($pos < sizeof($desordenado)) && (!$encontrado)){
      $encontrado = ($desordenado[$pos][$clave] == $valor);
      if (!$encontrado) $pos++;
    };

    // suponemos que siempre encontraremos una coincidencia:
    array_push($reordenado,$desordenado[$pos]);
  };

  // liberamos recursos:
  unset($desordenado,$ordenado,$clave,$k,$v,$valor,$pos,$encontrado);

  // devolvemos el array reordenado:
  return $reordenado;
};
  #5 (permalink)  
Antiguo 13/12/2005, 07:47
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 14 años, 11 meses
Puntos: 126
Otras soluciones usando "array_multisort()":

http://www.forosdelweb.com/f18/ordenar-array-bidemensional-131383/

Un saludo,
  #6 (permalink)  
Antiguo 14/12/2005, 04:47
 
Fecha de Ingreso: octubre-2004
Ubicación: Cork (Irlanda)
Mensajes: 161
Antigüedad: 12 años, 1 mes
Puntos: 1
Supongo... pero como con array_multisort no lo conseguía por eso pedí ayuda...
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 08:30.