por ordenar objetos multidimensional indice fecha array php arrays sorting multidimensional-array

objetos - ordenar json php



Ordenar matriz multidimensional por valor (9)

Afrontémoslo: php NO tiene una función simple lista para usar para manejar adecuadamente todos los escenarios de clasificación de arreglos.

Esta rutina es intuitiva, lo que significa una depuración y mantenimiento más rápidos:

// automatic population of array $tempArray = array(); $annotations = array(); // ... some code // SQL $sql retrieves result array $result // $row[0] is the ID, but is populated out of order (comes from // multiple selects populating various dimensions for the same DATE // for example while($row = mysql_fetch_array($result)) { $needle = $row[0]; arrayIndexes($needle); // create a parallel array with IDs only $annotations[$needle][''someDimension''] = $row[1]; // whatever } asort($tempArray); foreach ($tempArray as $arrayKey) { $dataInOrder = $annotations[$arrayKey][''someDimension'']; // .... more code } function arrayIndexes ($needle) { global $tempArray; if (!in_array($needle,$tempArray)) { array_push($tempArray,$needle); } }

¿Cómo puedo ordenar esta matriz por el valor de la tecla "orden"? Aunque los valores son actualmente secuenciales, no siempre lo serán.

Array ( [0] => Array ( [hashtag] => a7e87329b5eab8578f4f1098a152d6f4 [title] => Flower [order] => 3 ) [1] => Array ( [hashtag] => b24ce0cd392a5b0b8dedc66c25213594 [title] => Free [order] => 2 ) [2] => Array ( [hashtag] => e7d31fc0602fb2ede144d18cdffd816b [title] => Ready [order] => 1 ) )


El enfoque más flexible sería utilizar este método.

Arr::sortByKeys(array $array, $keys, bool $assoc = true): array

este es el por qué:

  • Puede ordenar por cualquier clave (también anidada como ''key1.key2.key3'' o [''k1'', ''k2'', ''k3''] )

  • Funciona tanto en matrices asociativas como no asociativas ( $assoc flag)

  • No usa referencia - devuelve nueva matriz ordenada

En tu caso sería tan simple como:

$sortedArray = Arr::sortByKeys($array, ''order'');

Este método es parte de esta biblioteca .


Para ordenar la matriz por el valor de la clave "título" use:

uasort($myArray, function($a, $b) { return strcmp($a[''title''], $b[''title'']); });

Strcmp compara las cuerdas.

uasort () mantiene las claves de la matriz como se definieron.


Pruebe un usort . Si todavía está en PHP 5.2 o anterior, primero tendrá que definir una función de clasificación:

function sortByOrder($a, $b) { return $a[''order''] - $b[''order'']; } usort($myArray, ''sortByOrder'');

A partir de PHP 5.3, puede utilizar una función anónima:

usort($myArray, function($a, $b) { return $a[''order''] - $b[''order'']; });

Y finalmente con PHP 7 puedes usar el operador de la nave espacial :

usort($myArray, function($a, $b) { return $a[''order''] <=> $b[''order'']; });

Para extender esto a la clasificación multidimensional, haga referencia a los elementos de clasificación segundo / tercero si el primero es cero; la mejor explicación se explica a continuación. También puede usar esto para clasificar en subelementos.

usort($myArray, function($a, $b) { $retval = $a[''order''] <=> $b[''order'']; if ($retval == 0) { $retval = $a[''suborder''] <=> $b[''suborder'']; if ($retval == 0) { $retval = $a[''details''][''subsuborder''] <=> $b[''details''][''subsuborder'']; } } return $retval; });

Si necesita conservar las asociaciones de claves, use uasort() - vea la comparación de las funciones de clasificación de matrices en el manual


Un enfoque para lograr esto sería así.

$new = [ [ ''hashtag'' => ''a7e87329b5eab8578f4f1098a152d6f4'', ''title'' => ''Flower'', ''order'' => 3, ], [ ''hashtag'' => ''b24ce0cd392a5b0b8dedc66c25213594'', ''title'' => ''Free'', ''order'' => 2, ], [ ''hashtag'' => ''e7d31fc0602fb2ede144d18cdffd816b'', ''title'' => ''Ready'', ''order'' => 1, ], ]; $keys = array_column($new, ''order''); $result = array_multisort($keys, SORT_ASC, $new);

Resultado:

Array ( [0] => Array ( [hashtag] => e7d31fc0602fb2ede144d18cdffd816b [title] => Ready [order] => 1 ) [1] => Array ( [hashtag] => b24ce0cd392a5b0b8dedc66c25213594 [title] => Free [order] => 2 ) [2] => Array ( [hashtag] => a7e87329b5eab8578f4f1098a152d6f4 [title] => Flower [order] => 3 ) )


Usualmente uso usort , y paso mi propia función de comparación. En este caso, es muy simple:

function compareOrder($a, $b) { return $a[''order''] - $b[''order'']; } usort($array, ''compareOrder'');


Yo uso esta función:

function array_sort_by_column(&$arr, $col, $dir = SORT_ASC) { $sort_col = array(); foreach ($arr as $key=> $row) { $sort_col[$key] = $row[$col]; } array_multisort($sort_col, $dir, $arr); } array_sort_by_column($array, ''order'');


$sort = array(); $array_lowercase = array_map(''strtolower'', $array_to_be_sorted); array_multisort($array_lowercase, SORT_ASC, SORT_STRING, $alphabetically_ordered_array);

Esto se ocupa de los alfabetos mayúsculas y minúsculas.


function aasort (&$array, $key) { $sorter=array(); $ret=array(); reset($array); foreach ($array as $ii => $va) { $sorter[$ii]=$va[$key]; } asort($sorter); foreach ($sorter as $ii => $va) { $ret[$ii]=$array[$ii]; } $array=$ret; } aasort($your_array,"order");