sort por ordenar objetos multidimensional fecha array php sorting arrays

ordenar - PHP array multiple sort-por valor luego por clave?



php sort multidimensional array (7)

Como Scott Saunders insinúa en su comentario a la solución de David, puede usar las funciones array_keys () y array_values ​​() para deshacerse del bucle. De hecho, puede resolver esto en una línea de código:

array_multisort(array_values($arrTags), SORT_DESC, array_keys($arrTags), SORT_ASC, $arrTags);

Tengo una matriz de claves de cadena con valores numéricos para usar en una lista de etiquetas con el número de apariciones de cada etiqueta, por lo tanto:

$arrTags[''mango''] = 2; $arrTags[''orange''] = 4; $arrTags[''apple''] = 2; $arrTags[''banana''] = 3;

esto es para que pueda mostrar la lista de etiquetas en orden descendente de la siguiente manera:

orange (4) banana (3) mango (2) apple (2)

Puedo usar Arsort para invertir el orden por el valor que es brillante, pero también quiero que las etiquetas que tienen el mismo valor numérico se ordenen alfabéticamente, por lo que el resultado final puede ser:

orange (4) banana (3) apple (2) mango (2)

¿hay alguna manera de que pueda hacer esto? Supongo que Usort puede ser el camino a seguir, ¡pero miro los ejemplos en php.net y mis ojos se ponen vidriosos! ¡¡¡muchas gracias!!!


Eche un vistazo a los ejemplos # 3: http://php.net/manual/en/function.array-multisort.php

Tendrá que crear dos matrices para usar como índices; una compuesta de las claves de la matriz original y la otra de los valores de la matriz original.

Luego, use multisort para ordenar por valores de texto (claves de la matriz original) y luego por los valores numéricos (valores de la matriz original).


Estás pensando demasiado complicado:

ksort($arrTags); arsort($arrTags);

Ahora su matriz está ordenada como lo desea.


La solución propuesta anterior parece lógica, pero simplemente no funciona:

ksort($arrTags); arsort($arrTags);

El código PHP completo para realizar la ordenación solicitada, será:

$k = array_keys($arrTags); $v = array_values($arrTags); array_multisort($k, SORT_ASC, $v, SORT_DESC); $arrTags = array_combine($k, $v);

Tenga en cuenta que array_multisort () usa referencias en las entradas del usuario, por lo que tendrá que usar dos variables temporales ($ ky $ v) para proporcionar contenido como entrada del usuario. De esta manera, array_multisort () puede cambiar el contenido. Más adelante, reconstruya la matriz ordenada a través de array_combine ().

He construido una función reutilizable para realizar esta tarea:

<?php /** * Sort a multi-dimensional array by key, then by value. * * @param array Array to be sorted * @param int One of the available sort options: SORT_ASC, SORT_DESC, SORT_REGULAR, SORT_NUMERIC, SORT_STRING * @param int One of the available sort options: SORT_ASC, SORT_DESC, SORT_REGULAR, SORT_NUMERIC, SORT_STRING * @return void * @example The following array will be reordered: * $a = array( * ''d'' => 4, * ''c'' => 2, * ''a'' => 3, * ''b'' => 1, * ''e'' => 2, * ''g'' => 2, * ''f'' => 2, * ); * SortArrayByKeyThanValue($a); # reorder array to: array( * ''b'' => 1, * ''c'' => 2, * ''e'' => 2, * ''f'' => 2, * ''g'' => 2, * ''a'' => 3, * ''d'' => 4, * ); * @author Sijmen Ruwhof <sijmen(a)secundity.com> * @copyright 2011, Secundity */ function SortArrayByKeyThanValue (&$pArray, $pSortMethodForKey = SORT_ASC, $pSortMethodForValue = SORT_ASC) { # check user input: sorting is not necessary if (count($pArray) < 2) return; # define $k and $v as array_multisort() needs real variables, as user input is put by reference $k = array_keys ($pArray); $v = array_values($pArray); array_multisort( $v, $pSortMethodForValue, $k, $pSortMethodForKey ); $pArray = array_combine($k, $v); } ?>


SlappyTheFish es correcto re: utilizando array_multisort vs. ksort, arsort

En el ejemplo de David ksort, arsort funciona bien, sin embargo, si los valores de cadena de las claves contienen caracteres distintos a los alfabéticos, es posible que la clasificación no funcione según lo previsto.

ex:

$arrTags[''banana''] = 3; $arrTags[''mango''] = 2; $arrTags[''apple1''] = 2; $arrTags[''orange''] = 4; $arrTags[''almond1''] = 2; ksort($arrTags); arsort($arrTags); print_r($arrTags);

devoluciones:

Array ( [orange] => 4 [banana] => 3 [apple1] => 2 [mango] => 2 [almond1] => 2 )

sin embargo usando:

$arrTags[''banana''] = 3; $arrTags[''mango''] = 2; $arrTags[''apple1''] = 2; $arrTags[''orange''] = 4; $arrTags[''almond1''] = 2; $tag = array(); $num = array(); foreach($arrTags as $key => $value){ $tag[] = $key; $num[] = $value; } array_multisort($num, SORT_DESC, $tag, SORT_ASC, $arrTags); print_r($arrTags);

devoluciones:

Array ( [orange] => 4 [banana] => 3 [almond1] => 2 [apple1] => 2 [mango] => 2 )


Resuelto

Después de una pequeña experimentación, descubrí que array_multisort hace el truco muy bien:

$tag = array(); $num = array(); foreach($arrTags as $key => $value){ $tag[] = $key; $num[] = $value; } array_multisort($num, SORT_DESC, $tag, SORT_ASC, $arrTags);

:)


//preserve arrays keys for later use $ar1= array_keys($your_array); //preserve array''s values for later use $ar2= array_values($your_array); //perform sorting by value and then by key array_multisort($ar2, SORT_DESC, $ar1, SORT_DESC); //combine sorted values and keys arrays to new array $sorted_array = array_combine($ar1, $ar2);

Debe estar bien