sort por ordenar numeros multidimensional fecha array php usort

php - ordenar - usort(): Array fue modificado por la función de comparación de usuario



usort php (5)

Tengo una aplicación web que funciona bien en nuestros servidores Linux, pero cuando se ejecuta en Mac OS con Zend Community Edition Server con PHP 5.3, aparece el siguiente error:

usort (): Array fue modificado por la función de comparación de usuario

cada vez que una página se carga por primera vez (la página tarda unos 2 minutos en marcar y cargar, en los servidores de Linux la página se carga en 1 segundo).

¿Alguien más ha experimentado esto o tiene alguna idea de cómo puedo solucionar el problema, he intentado jugar con PHP y la configuración de memoria Apache sin suerte.


¿Qué versión de PHP está en el cuadro de Linux?

¿Los niveles de error_reporting son los mismos en ambos cuadros? Intenta configurar ambos en E_ALL.

La advertencia casi seguramente no es mentira. Se dice que la función de comparación que está pasando a usort () está cambiando la matriz que está tratando de clasificar , lo que definitivamente podría hacer que la conexión tarde mucho tiempo, ¡posiblemente para siempre!

Mi primer paso sería estudiar la función de comparación y descubrir por qué está sucediendo eso. Es posible que si los cuadros de Linux usan una versión anterior a la 5.3, hay alguna diferencia en el comportamiento de alguna función de lenguaje utilizada en la función de comparación.


Descubrí que al usar PHP5.4, el registro con error_log($message, $message_type, $destination, $extra_headers) causa este error, cuando limpio las entradas de registro mi problema se resuelve. El registro puede suspenderse temporalmente al deshabilitar y restaurar el registro después de la función de clasificación.


Existe un error de PHP que puede causar esta advertencia, incluso si no cambia la matriz.

Versión corta, si las funciones de depuración de PHP examinan la matriz de clasificación, cambiarán el recuento de referencias y usort() para que usort() que ha cambiado los datos.

Por lo tanto, obtendrá esa advertencia haciendo lo siguiente en su función de ordenación (o cualquier código llamado desde ella):

  • llamando a var_dump o print_r en cualquiera de los datos de clasificación
  • llamando a debug_backtrace()
  • lanzando una excepción, cualquier excepción, o simplemente creando una excepción

El error afecta a todas las versiones de PHP 5> = 5.2.11 pero no afecta a PHP> = 7. Consulte el informe de fallas para obtener más detalles.

Por lo que puedo ver, la única solución alternativa es "do not do that" (que es un poco difícil para las excepciones), o use el operador de supresión de errores @usort() para ignorar todos los errores.


Experimenté este problema cuando PHP estaba arrojando un error dentro de mi función de devolución de llamada. Entonces, en lugar de escupir el error real que estaba sucediendo, PHP lanzaría:

usort (): Array fue modificado por la función de comparación de usuario


Para resolver este problema, podemos manejarlo de la siguiente manera

1) use error_reporting

$a = array(''id'' => 2,''val'' => 3, ''ind'' => 3); $errorReporting = error_reporting(0); usort($a); error_reporting($errorReporting);

2) use @usort($a);

$a = array(''id'' => 2,''val'' => 3, ''ind'' => 3); @usort($a);