Foros del Web » Programando para Internet » PHP »

Ordenar un array asociativo por un campo concreto

Estas en el tema de Ordenar un array asociativo por un campo concreto en el foro de PHP en Foros del Web. Hola a todos, tengo el siguiente código: function orderByCampo($items, $attr, $order) { $sortedItems = []; foreach ($items as $item) { $key = is_object($item) ? $item->{$attr} ...
  #1 (permalink)  
Antiguo 16/11/2020, 12:40
 
Fecha de Ingreso: junio-2007
Mensajes: 298
Antigüedad: 16 años, 10 meses
Puntos: 5
Ordenar un array asociativo por un campo concreto

Hola a todos, tengo el siguiente código:

function orderByCampo($items, $attr, $order) {
$sortedItems = [];
foreach ($items as $item) {
$key = is_object($item) ? $item->{$attr} : $item[$attr];
$sortedItems[$key] = $item;
}
if ($order === 'desc') {
krsort($sortedItems);
} else {
ksort($sortedItems);
}
return array_values($sortedItems);
}

$arrPrueba = array();

$arrPrueba[0]["id"] = 1;
$arrPrueba[0]["prioridad"] = 1.6;
$arrPrueba[0]["texto"] = "uno";

$arrPrueba[1]["id"] = 2;
$arrPrueba[1]["prioridad"] = 1.0;
$arrPrueba[1]["texto"] = "dos";

$arrPrueba[2]["id"] = 3;
$arrPrueba[2]["prioridad"] = 0.4;
$arrPrueba[2]["texto"] = "tres";

$arrPrueba[3]["id"] = 4;
$arrPrueba[3]["prioridad"] = -0.8;
$arrPrueba[3]["texto"] = "cuatro";

$arrPrueba[4]["id"] = 5;
$arrPrueba[4]["prioridad"] = -0.6;
$arrPrueba[4]["texto"] = "cinco";

orderByCampo($arrPrueba, "prioridad", "asc");

foreach ($arrPrueba as $clave=>$valor) {
echo $valor["id"]."<br>";
echo $valor["prioridad"]."<br>";
echo $valor["texto"];
echo "<hr>";
}

Pero no me funciona, no me ordena el array por el campo prioridad (lo deja como está originalmente). ¿en qué puede estar fallando este código? llevo ya una hora con ello y no localizó en qué puede fallar.

Espero vuestra respuesta.

Muchas gracias por adelantado.
  #2 (permalink)  
Antiguo 16/11/2020, 18:52
 
Fecha de Ingreso: abril-2006
Mensajes: 583
Antigüedad: 18 años
Puntos: 120
Respuesta: Ordenar un array asociativo por un campo concreto

primero que todo veo, un problema

en un array php, no puedes asignar un DOUBLE o FLOAT como INDEX

por que no puedes hacer
Código PHP:
Ver original
  1. <?php
  2. $array=array();
  3. $array[ -0.6] =  'el index es invalido';
  4. $array[ 10.15] =  'este otroe s invalido tambien';

debido a que si lo intentas, como lo etas haciendo, PHP interpretara como mejor le convenga, en la version7.1 que probe, redondea el INDEX 0.6 a 0 y el -1.1 a -1

asi que puedes optar por convertir ese INDEX en un STRING para hacerlo valido

Código PHP:
Ver original
  1. <?php
  2. $array=array();
  3. $array[ "-0.6"] =  'el index es VALIDO';
  4. $array[ "10.15"] =  'este otroe s VALIDO tambien';

en todo caso creo que te vendria mejor usar la funcion para ordenar array, nativa de php
uasort

https://www.php.net/manual/es/function.uasort.php

Código PHP:
Ver original
  1. function comparar_elemento ($a, $b) {
  2.     if ($a["prioridad"] == $b["prioridad"]) {
  3.         return 0;
  4.     }
  5.     return ($a["prioridad"] < $b["prioridad"]) ? -1 : 1;
  6. }

como plus, en PHP 5.4 puedes usar funciones LAMBDA y agregar variables en el SCOPE de las funciones

function ( ) use () {}
__________________
Mis aportes te ayudaron??, te hicieron ahorrar valiosos tiempo??, si quieres puedes agradecerme con un Gracias o con una donacion
https://paypal.com/pools/c/8lmNLmWnG9
  #3 (permalink)  
Antiguo 17/11/2020, 01:31
 
Fecha de Ingreso: junio-2007
Mensajes: 298
Antigüedad: 16 años, 10 meses
Puntos: 5
Respuesta: Ordenar un array asociativo por un campo concreto

Muchísimas gracias. Es justo lo que necesitaba.

Etiquetas: asociativo, campo, echo
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 04:51.