Si tienes la mala suerte de trabajar con un servidor de PHP 5.X seguramente sufras de un bug que provoca un warning al trabajar con arrays. Si recibes el siguiente error Warning: usort(): Array was modified by the user comparison function este artículo puede interesarte.
¿Qué está pasando?
Algunas funciones de debug de PHP al examinar un array cambian alguna referencia interna y engañan a usort()
haciéndole pensar que los datos han cambiado. De ese modo se lanza un warning aunque en el código realmente no se haya modificación de ninguna forma.
Podéis ver más información sobre el bug en php.net.
¿Como solucionarlo?
Si bien existen otras formas de provocar el bug nos centraremos en el que ocurre usando usort
. Hay tres formas de solucionar el bug, no usando usort
, silenciando los warnings de esta función con @ @usort()
o usando error_reporting
para evitar los warnings en toda la aplicación.
¿No estas usando usort()
y aún así recibes este error?
Si usas Symfony y DoctrineFixture recibirás este error al hacer php bin/console doctrine:fixture:load
. Para evitarlo puedes modificar el fichero: «/vendor/doctrine/data-fixtures/lib/Doctrine/Common/DataFixtures/Loader.php» y en la linea 211 tenemos la maldita usort
a la que podemos «silenciar» con @.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
/** * Orders fixtures by number * * @todo maybe there is a better way to handle reordering * @return void */ private function orderFixturesByNumber() { $this->orderedFixtures = $this->fixtures; @usort($this->orderedFixtures, function($a, $b) { if ($a instanceof OrderedFixtureInterface && $b instanceof OrderedFixtureInterface) { if ($a->getOrder() === $b->getOrder()) { return 0; } return $a->getOrder() < $b->getOrder() ? -1 : 1; } elseif ($a instanceof OrderedFixtureInterface) { return $a->getOrder() === 0 ? 0 : 1; } elseif ($b instanceof OrderedFixtureInterface) { return $b->getOrder() === 0 ? 0 : -1; } return 0; }); } |
Esta solución tiene el problema de que puede ser machacada en cualquier momento por un composer update
pero es la más rápida para salir del paso y nos permite cargar los fixtures y continuar trabajando.