Foros del Web » Programando para Internet » PHP »

Ordenar array por tipo de dato

Estas en el tema de Ordenar array por tipo de dato en el foro de PHP en Foros del Web. Hola gente vengo con un problema que encuentro una solución que me convenza, bah, si me convence, lo que no me convence es el manual ...
  #1 (permalink)  
Antiguo 24/12/2014, 08:41
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Ordenar array por tipo de dato

Hola gente vengo con un problema que encuentro una solución que me convenza, bah, si me convence, lo que no me convence es el manual de PHP.

<-- Inicio preámbulo, es solo para entrar en tema, podes saltearte lo que esta en verde -->

El problema es el siguiente, estoy haciendo un micro-motor de plantillas, algunas plantillas por ejemplo las de comentarios y respuestas son recursivas ya que las respuestas se van anidando.

Como no quiero usar recursividad para resolver el problema porque no se me antoja, lo estoy haciendo iterativo.

El algoritmo recibe el texto de template y un array multidimensional con los valores que tiene que reemplazar en el texto.

El problema que tengo, es que para que la rutina iterativa funcione igual que una recursiva, necesito procesar primero los valores que sean arrays antes que los que sean string o numéricos.


Supongamos que tengo el siguiente array de parámetros:
Código PHP:
Ver original
  1. $array = [
  2.     "texto" => "string",
  3.     "numero" => 22,
  4.     "arreglo" => ["datos", "datos", "mas datos"],
  5.     "arreglo_vacio" => []
  6. ];

Lo que quiero es que al principio estén los arrays y luego el resto de las variables mundanas, mantener las claves es importante.

Si uso la función rsort así:

Código PHP:
Ver original
  1. rsort($array);
  2. var_dump($array);

obtengo:
Código:
array (size=4)
  0 => 
    array (size=3)
      0 => string 'datos' (length=5)
      1 => string 'datos' (length=5)
      2 => string 'mas datos' (length=9)
  1 => 
    array (size=0)
      empty
  2 => int 22
  3 => string 'string' (length=6) 
Que en principio estaría bien.

El manual de rsort me dice que mire el manual de sort que son iguales.
El problema es que mirando el manual de sort me encontré con que:
Cita:
Advertencia:
Se ha de tener cuidado cuando se ordenen arrays con valores de tipos mixtos ya que sort() puede producir resultados impredecibles.


No me queda claro, ¿Cuidado con que? ¿Que significa "impredecible"? ¿Que puede venir en cualquier orden? ¿Que pude lanzar excepciones? ¿Que explota todo? ¿Que a mi mama le van mandar mas promociones los de la telefónica?

El caso es que me es imprescindible que siempre estén primero los arrays, no puedo dejar eso a la suerte.

La otra opción que se me ocurre es usar uasort asi:
Código PHP:
Ver original
  1. uasort($array, "is_array");
Pero esto es mas lento y costoso que rsort.

¿Alguna idea?
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Última edición por NSD; 24/12/2014 a las 16:10
  #2 (permalink)  
Antiguo 24/12/2014, 15:47
(Desactivado)
 
Fecha de Ingreso: enero-2013
Mensajes: 289
Antigüedad: 11 años, 3 meses
Puntos: 10
Respuesta: Ordenar array por tipo de dato

sort parece funcionar bien con tipos mixtos

Código PHP:
<?php
$fruits 
= array("lemon","Lemon"20"banana""apple","121",40,50);
$fruits array_map("strtolower"$fruits); //using strtolower

sort($fruits );
foreach (
$fruits as $key => $val) {
    echo 
"fruits[" $key "] = " $val "\n";
}
?>
Outputs

fruits[0] = 20
fruits[1] = 40
fruits[2] = 50
fruits[3] = 121
fruits[4] = apple
fruits[5] = banana
fruits[6] = lemon
fruits[7] = lemon
  #3 (permalink)  
Antiguo 24/12/2014, 16:17
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: Ordenar array por tipo de dato

Cita:
Iniciado por moginn Ver Mensaje
sort parece funcionar bien con tipos mixtos
El tema no es lo que parezca que hace, sino lo que hace realmente.
No me alcanza con que parezca que funciona, quiero que funcione siempre y para todos los casos.

El manual incluye una advertencia que ya copie en el primer mensaje. Eso es lo que me preocupa.

Por cierto, dije que quería poner los arrays primero ¿para que querría mapear con "strtolower" a un array que ademas lanza warning?
Ademas, luego de ese mapeo, no hay tipos mixtos, son todos string, por eso funciona bien.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios

Etiquetas: dato, tipo, variable
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 07:26.