strnatcasecmp - strcmp equivelant para enteros(intcmp) en PHP
strcmp php case insensitive (7)
¿Por qué reinventar la rueda? http://php.net/manual/en/function.strnatcmp.php
echo strnatcmp(1, 2) . PHP_EOL; // -1
echo strnatcmp(10, 2) . PHP_EOL; // 1
echo strnatcmp(10.5, 2) . PHP_EOL; // 1 - work with float numbers
echo strnatcmp(1, -2) . PHP_EOL; // 1 - work with negative numbers
Pruébelo aquí: https://3v4l.org/pSANR
Así que tenemos esta función en PHP
strcmp(string $1,string $2) // returns -1,0, or 1;
Sin embargo, no tenemos un intcmp (); Así que creé uno:
function intcmp($a,$b) {
if((int)$a == (int)$b)return 0;
if((int)$a > (int)$b)return 1;
if((int)$a < (int)$b)return -1;
}
Esto solo se siente sucio. ¿Qué piensan todos ustedes?
esto es parte de una clase para clasificar Javascripts por un valor de orden pasado.
class JS
{
// array(''order''=>0,''path''=>''/js/somefile.js'',''attr''=>array());
public $javascripts = array();
...
public function __toString()
{
uasort($this->javascripts,array($this,''sortScripts''));
return $this->render();
}
private function sortScripts($a,$b)
{
if((int)$a[''order''] == (int)$b[''order'']) return 0;
if((int)$a[''order''] > (int)$b[''order'']) return 1;
if((int)$a[''order''] < (int)$b[''order'']) return -1;
}
....
}
¿Tiene que ser +1 y -1? Si no, solo devuelve (int) $a - (int) $b
. No me gusta la división que alguien más recomendó, y no es necesario verificar los tres casos. Si no es mayor ni igual, debe ser menor que.
return (int) $a > (int) $b ? 1 : (int) $a == (int) $b ? 0 : -1;
De un vistazo, sí, se siente sucio. Excepto que debe haber una buena razón por la que escribió eso en lugar de simplemente usar los operadores ==
, >
y <
. ¿Cuál fue la motivación para crear esta función?
Si fuera yo, probablemente solo haga algo como:
$x = $a==$b ? 0 : ($a>$b ? 1 : ($a<$b ? -1 : null));
Me doy cuenta de que esto es igual de feo, y el : null;
- No estoy seguro si PHP lo requiere o si podría haberlo hecho :;
pero no me gusta y ese código nunca debe ejecutarse de todos modos ... ¡Creo que estaría mucho menos confundido si supiera los requisitos originales!
Ordena tus datos con:
function sortScripts($a, $b)
{
return $a[''order''] - $b[''order''];
}
Use $ b- $ a si desea el orden inverso.
Si los números en cuestión exceden el rango entero de PHP, return ($a < $b) ? -1 : (($a > $b) ? 1 : 0)
return ($a < $b) ? -1 : (($a > $b) ? 1 : 0)
es más robusto.
Podrías usar
function intcmp($a,$b)
{
return ($a-$b) ? ($a-$b)/abs($a-$b) : 0;
}
Aunque no veo el sentido de usar esta función en absoluto
Simplemente como información adicional, se ha aceptado un RFC para esto ( https://wiki.php.net/rfc/combined-comparison-operator ).
Entonces, la función de comparación estaría en la línea de ...
<?php
$data = [...];
usort($data, function($left, $right){ return $left <=> $right; });
?>
Una muy buena característica aquí es que la comparación se realiza exactamente de la misma manera que todas las demás comparaciones. Así que el malabarismo tipo sucederá como se espera.
Hasta el momento, no existe el método mágico __forCompare () para permitir que un objeto exponga un valor de comparación. La propuesta actual (un RFC diferente) es hacer que cada objeto se inyecte en cada otro objeto durante la comparación para que haga la comparación, algo que me parece extraño: ¡oportunidad potencial para la recursión y el desbordamiento de la pila ...! Pensé que inyectar el tipo de objeto para comparar (permitir a un objeto la capacidad de representar los valores apropiados según el tipo de comparación) o una solicitud ciega de un valor que el objeto puede servir para comparar, hubiera sido más seguro solución.
Todavía no está integrado en PHP-NG (PHP 7 en este momento), pero con suerte lo estará pronto.
Yo no lo llamaría sucio per se, parece lo suficientemente válido. Pero no puedo pensar dónde usaría esa función. Mi única sugerencia podría ser incluir algo else
:
function intcmp($a,$b)
{
if((int)$a == (int)$b)return 0;
else if((int)$a > (int)$b)return 1;
else if((int)$a < (int)$b)return -1;
}