with sort php sorting multidimensional-array usort

php - with - ¿Cómo funciona usort?



paginate laravel (5)

Como los otros mencionados, usort utiliza el algoritmo Quicksort. En una nota al margen, no es necesario que haga explícitamente la comparación entre dos cadenas. Puedes usar los métodos de comparación de cadenas de PHP.

La función que creaste,

function cmp($a, $b) { if ($a["month"] == $b["month"]) { return 0; } return ($a["month"] < $b["month"]) ? -1 : 1; }

simplemente podría escribirse como sigue

function compareMyStrings($a, $b){ return strnatcmp($a["month"], $b["month"]); }

¡Espero que esto ayude!

He examinado la documentación de php, los tutoriales en línea y ninguno de ellos está funcionando realmente como funciona. Tengo un ejemplo que estaba jugando abajo.

$data = array( array(''msg'' => ''some text'',''month'' => 11,''level'' => 10), array(''msg'' => ''some text'',''month'' => 5,''level'' => 10), array(''msg'' => ''some text'',''month'' => 8,''level'' => 10), array(''msg'' => ''some text'',''month'' => 12,''level'' => 10), array(''msg'' => ''some text'',''month'' => 2,''level'' => 10), array(''msg'' => ''some text'',''month'' => 3,''level'' => 10), array(''msg'' => ''some text'',''month'' => 4,''level'' => 10), array(''msg'' => ''some text'',''month'' => 7,''level'' => 10), array(''msg'' => ''some text'',''month'' => 10,''level'' => 10), array(''msg'' => ''some text'',''month'' => 1,''level'' => 10), array(''msg'' => ''some text'',''month'' => 6,''level'' => 10), array(''msg'' => ''some text'',''month'' => 9,''level'' => 10) );

Quería poder ordenar los meses del 12 al 1 (ya que no están organizados) a través de alguna ayuda. Esta fue la solución.

function cmp($a, $b) { if ($a["month"] == $b["month"]) { return 0; } return ($a["month"] < $b["month"]) ? -1 : 1; } usort($data, "cmp");

pero no entiendo cómo la función cmp ordena la matriz. Intenté imprimir cada variable $ ay $ b como esto:

function cmp($a, $b) { echo "a: ".$a[''month'']."<br/>; echo " b: ".$b[''month'']."<br/>; echo "<br/><br/>"; }

y la salida fue

a: 3 b: 5 a: 9 b: 3 a: 3 b: 8 a: 6 b: 3 a: 3 b: 12 a: 1 b: 3 a: 3 b: 2 a: 10 b: 3 a: 3 b: 11 a: 7 b: 3 a: 4 b: 3 a: 12 b: 2 a: 5 b: 12 a: 12 b: 11 a: 8 b: 12 a: 5 b: 8 a: 2 b: 11 a: 6 b: 9 a: 7 b: 6 a: 6 b: 4 a: 10 b: 6 a: 1 b: 6 a: 9 b: 4 a: 7 b: 1 a: 10 b: 7

no tiene sentido cómo funciona la clasificación y por qué se utiliza cmp ($ a, $ b). He intentado imprimir todos sus procesos como puede ver, pero no he encontrado ninguna solución a cómo funciona todo ...

Gracias


Esta es otra solución que encontré.

<?php $users = array( array( "peter", "male", "46"), array( "hans", "male", "19"), array( "john", "male", "30"), array( "linda", "female", "54"), array( "erika", "female", "79")); usort($users, "whatevername"); function whatevername($whatever1, $whatever2) { // $whatever1 and $whatever2 are items from the $user array. // index [2] is the age. // Check if $whatever1 is older than $whatever2. // Return 1 tells usort to swap the positions. return $whatever1[2] > $whatever2[2]; } echo("<pre>"); print_r($users); echo("</pre>"); ?>


La devolución de llamada proporcionada a las funciones de clasificación en PHP tiene tres valores de retorno:

0: both elements are the same -1 (<0): the first element is smaller than the second 1 (>0): the first element is greater

Ahora, usort probablemente utiliza algún tipo de quicksort o mergesort internamente. Para cada comparación, llama a su devolución de llamada con dos elementos y luego decide si necesita intercambiarlos o no.


La función cmp sí no hace la clasificación. Simplemente nos dice a usort si un valor es más pequeño, igual o mayor que otro valor. Por ejemplo, si $a = 5 y $b = 9 devolverá 1 para indicar que el valor en $b es mayor que el de $a .

La clasificación es realizada por usort .


usort() utiliza una implementación de Quicksort para ordenar la matriz, llama a su función cmp tantas veces como sea necesario para ordenar completamente la matriz utilizando ese algoritmo.