PHP-Hispano.net Comunidad hispana de desarrollo web

Contacto | #php_para_torpes | Enlázanos | ¿Quiénes somos?

11 usuarios Online (0)

Darse de alta en la web | Recuperar password   
Inicio / Foros / PHP / Cambiar las posiciones de los elementos de un array

Cambiar las posiciones de los elementos de un array

10 respuestas 4134 visitas Categoría PHP

Cambiar las posiciones de los elementos de un array

Avatar de antoniogil

Nivel 1 (5 posts)

* * * * * * *

0 Agradecimientos

#0 Offline antoniogil 26 abr 10
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!

Re: Cambiar las posiciones de los elementos de un array

Avatar de Zubyc

Nivel 5 (1173 posts)

* * * * * * *

50 Agradecimientos

#1 Offline Zubyc 27 abr 10 0 personas consideran útil este post.
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?

Re: Cambiar las posiciones de los elementos de un array

Avatar de antoniogil

Nivel 1 (5 posts)

* * * * * * *

0 Agradecimientos

#2 Offline antoniogil 27 abr 10 0 personas consideran útil este post.
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!

Re: Cambiar las posiciones de los elementos de un array

Avatar de Eloy8857

Nivel 5 (973 posts)

* * * * * * *

159 Agradecimientos

#3 Offline Eloy8857 27 abr 10 0 personas consideran útil este post.
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.

Restless Souls Online: se viene un gran MMORPG

Asunto

Avatar de antoniogil

Nivel 1 (5 posts)

* * * * * * *

0 Agradecimientos

#4 Offline antoniogil 27 abr 10 0 personas consideran útil este post.
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!

no entedi :S

Avatar de wariodiaz

Nivel 1 (13 posts)

* * * * * * *

2 Agradecimientos

#5 Offline wariodiaz 28 abr 10 0 personas consideran útil este post.
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.

Re: Cambiar las posiciones de los elementos de un array

Avatar de Eloy8857

Nivel 5 (973 posts)

* * * * * * *

159 Agradecimientos

#6 Offline Eloy8857 28 abr 10 0 personas consideran útil este post.
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.

Restless Souls Online: se viene un gran MMORPG

Re: Cambiar las posiciones de los elementos de un array

Avatar de antoniogil

Nivel 1 (5 posts)

* * * * * * *

0 Agradecimientos

#7 Offline antoniogil 28 abr 10 0 personas consideran útil este post.
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!

Re: Cambiar las posiciones de los elementos de un array

Avatar de Eloy8857

Nivel 5 (973 posts)

* * * * * * *

159 Agradecimientos

#8 Offline Eloy8857 28 abr 10 0 personas consideran útil este post.
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.

Restless Souls Online: se viene un gran MMORPG

Re: Cambiar las posiciones de los elementos de un array

Avatar de antoniogil

Nivel 1 (5 posts)

* * * * * * *

0 Agradecimientos

#9 Offline antoniogil 28 abr 10 0 personas consideran útil este post.
Ummmm....

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

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

Saludos!

Re: Cambiar las posiciones de los elementos de un array

Avatar de Eloy8857

Nivel 5 (973 posts)

* * * * * * *

159 Agradecimientos

#10 Offline Eloy8857 29 abr 10 0 personas consideran útil este post.
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.

Restless Souls Online: se viene un gran MMORPG

Responder mensaje

Para poder participar debes ser un usuario registrado de PHP-Hispano. :: Deseo darme de alta en esta comunidad ::
Login / Password   

Temas relacionados

E Titulo Respuestas Última resp. Creado el Visitas Foro
Pregunta SOLUCION array de conversión 5 28 mar 12
por jurena
mar, 20 mar 12 (18:43)
por jurena
623 PHP

php-hispano.net 2002 - 2013 | XHTML 1.0
Datos Legales | Webmaster