Cambiar las posiciones de los elementos de un array

5451 visitas 10 respuestas

Buenas a todos!

No se si se podrá hacer lo que estoy buscando, pero a ver si alguien lo ha visto alguna vez.

Tengo un array bidimensional que contiene las siguientes "columnas", por llamarlos de algún modo, ya que despues se muestran en una tabla:

Array (
 [0] => Array ( [id] => 1 [precio] => 12.00 [nombre] => producto1 ) 
 [1] => Array ( [id] => 2 [precio] => 33.00 [nombre] => producto2 ) 
 [2] => Array ( [id] => 3 [precio] => 54.00 [nombre] => producto3 ) 
 [3] => Array ( [id] => 4 [precio] => 85.00 [nombre] => producto4 ) 
 [4] => Array ( [id] => 5 [precio] => 26.00 [nombre] => producto5 )
 ) 

  Y lo que quiero es teniedo otro array con los nombre de las columnas en un determinado orden:

Array (     [0] => id     [1] => nombre     [2] => precio ) 

Cambiar la posicion del primer array, para que quede de la siguiente forma:

Array (
 [0] => Array ( [id] => 1 [nombre] => producto1 [precio] => 12.00 ) 
 [1] => Array ( [id] => 2 [nombre] => producto2 [precio] => 33.00 ) 
 [2] => Array ( [id] => 3 [nombre] => producto3 [precio] => 54.00 ) 
 [3] => Array ( [id] => 4 [nombre] => producto4 [precio] => 85.00 ) 
 [4] => Array ( [id] => 5 [nombre] => producto5 [precio] => 26.00)
 ) 

¿Es posible hacer algo como esto?

Ya se que se podría hacer antes de formar el array, pero la cosa es que este array se forma de dos consultas a dos tablas distintas y luegos se hace un array_merge().

El mayor problema es que el método que hace esto es genérico, es decir, que se le pasan las tablas, los campos, etc... Por lo tanto no puedo saber que campos, son los que tienen que ir en cada posicion, porque en un caso se llamará nombre en otro descripcion, o uno tendrá 2 campos otro 3...

Por eso no se como hacerlo a posteriori teniendo ese array.

He mirado las funciones de php (http://www.php.net/manual/en/ref.array.php), pero no encuentro lo que necesito.

Espero que me puedan ayudar!

Gracias y Saludos!

por antoniogil desde España

Registrado desde: 10 Jun 08

Respuestas

0 0

No me queda muy claro lo que quieres hacer. Tienes una array generado de forma automática, en base a unas consultas. Y quieres que sea algo genérico, pero para poderte ayudar creo que vendría bien saber qué es lo que pretendes hacer con ese array, porque has explicado un caso concreto, pero y si te viene otra tabla con otros campos, qué cambios habría que hacer?

por Javier O. desde España

Registrado desde: 02 Jul 02
0 0

Buenas!!

eso que me comentas ya está hecho!

Lo único que me hace falta es poder cambiar el orden de las clave.

Gracias y Saluos!

por antoniogil desde España

Registrado desde: 10 Jun 08
1 0

Para este caso concreto, como el orden de los índices es alfanumérico ascendente, puedes usar asort sobre la segunda dimensón del array.

Pero si no siempre va a ser así, tendrás que hacer una función tipo ordenarPersonalizado($key, &$value, array $orden) y usarla con array_walk.

La cosa sería asociar a $value el array con el orden impuesto por $orden... pero mejor no te lo doy hecho :P

Saludos.

por Eloy8857 desde España

Registrado desde: 14 Jan 09
0 0

Buenas!

Gracias por la respuesta, pero no me podrías poner un ejemplo de lo que dices para ver a los que te refieres?

No es para que me lo des hecho, pero es que no se mucho de PHP y me cuesta aún.

Te lo agradecería mucho!!

Gracias de nuevo y Saludos!

por antoniogil desde España

Registrado desde: 10 Jun 08
0 0

la verdad no entedi muy bien muy bien lo que quieres hacer.. y si es lo que estoy entendiendo no se puede.. =P...

¿Quieres ordenar un Array Asociativo?...

yo que sepa no se puede :S... ordenar uno ya que los indices en string no llevan un orden, verifique y tanto con un foreach o con un print_r se imprime segun el orden en que se definieron, entoces supongo que tendrias q redefini otro array copiado el priemro a un temporar con el orden que quieres y luego replazar el origina con el temporal, y así lograr el orden automatico...

pero por lo que veo el segundo arreglo te define el orden de como imprimirias  el primero.. pues solo tienes que interar el orden en el oren coreecto. . pero ps no se muy bien si eso es lo que quieres hacer.

por wariodiaz desde México

Registrado desde: 26 Apr 10
0 0

Me equivoqué de función, no es asort sino ksort. Mira la documentación de ksort y de array_walk antoniogil.

La primera era una solución en caso de que el orden que quieras establecer sea alfanumérico ascendente (para descendente tienes krsort), ya que en ese caso sólo tienes que recorrer el array principal y pasarle un asort a cada índice (los arrays de cada elemento).

La segunda solución, array_walk, es para usarla si el orden que quieres establecer es personalizado (a, r, b, y, r, q, a...). Se trata de definir una función que reasignaría el array a ordenar (los elementos del principal); esa función deberías declararla con el prototipo function (usa los identificadores que mejor te parezcan):

function ordenarPersonalizado(&$item, $indice, Array $orden). 

Viendo la documentación de array_walk piensa cómo funcionaría esa función y si tienes dudas o no te funciona pon el código que has probado y vamos ayudándote :)

Saludos.

por Eloy8857 desde España

Registrado desde: 14 Jan 09
0 0

Buenas!

Al final lo que he realizado es esta función donde se le pasa el array y otro con el orden:

private function ordenListado($aValores, $aOrden)         {             $aNuevosValores = array();                         foreach ($aValores as $key => $array) {                 $temp = array();                 foreach ($aOrden as $num => $sOrd) {                     foreach ($array as $clave => $valor) {                         if ($sOrd == $clave) {                             $temp[$clave] = $valor;                         }                     }                 }                 $aNuevosValores[$key] = $temp;             }         }

No se si es lo más optimo, pero me funciona!

Gracias a todos por las respuestas!

Saludos!

por antoniogil desde España

Registrado desde: 10 Jun 08
0 0

Está bien :). Con array_walk se podría haber hecho:

<?php

function ordenListado(&$item, $indice, Array $orden){

$temp = array();

foreach ($orden as $valor) {
    if (isset($item[$valor])) {
        $temp[$valor] = $item[$valor];
    }
}

$item = $temp;

}

$arrayOrdenado = array_walk($arrayOriginal, 'ordenListado', $orden); ?>

Es simple pero si los arrays a ordenar no tienen los índices que le pasas en orden se te quedarían vacíos... pero para evitar eso puedes jugar con array_diff :)

Saludos.

por Eloy8857 desde España

Registrado desde: 14 Jan 09
0 0

Ummmm....

Voy a probar el tuyo...es mucho más pro! jeje.

Aunque no se a que te refieres con array_diff...

Saludos!

por antoniogil desde España

Registrado desde: 10 Jun 08
0 0

Con array_diff obtienes los elementos de un array que no están en otro. Si sacas los del array original que no están en el ordenado, sabrás que al sobrescribirlo vas a perder elementos.

Sabiendo eso puedes decidir cómo se comportará la función: no cambiará nada, lanzará una excepción, o los que no estén los añadirá al final. Para el último caso podrías usar un simple array_merge con el ordenado primero y luego el original.

Saludos.

por Eloy8857 desde España

Registrado desde: 14 Jan 09