2010-05-17 18 views
48

así que conseguimos esta función en PHPequivelant strcmp para enteros (intcmp) en PHP

strcmp(string $1,string $2) // returns -1,0, or 1; 

Nos No obstante, tener 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 simplemente se siente sucio. ¿Qué piensan todos ustedes?

esto es parte de una clase para ordenar Javascripts por un valor de pedido se ha 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; 
    } 
    .... 
} 
+3

¿Por qué quieres una función tal ?? –

+0

Nos encantaría un ejemplo que muestre * por qué * (¡llámenos curiosos!). – JYelton

+3

Entonces solo necesita eso: 'sortScripts ($ a, $ b) {return $ a- $ b; } ' Solo necesita poner $ b- $ a por tener cosas en el orden inverso. –

Respuesta

81

clasificar sus datos con:

function sortScripts($a, $b) 
{ 
    return $a['order'] - $b['order']; 
} 

Uso $ 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) es más robusto.

+1

Tuve que usar ($ b- $ a) * - 1 para ordenar en orden inverso. pero yo divago. ¡Gracias! –

+1

¡Ja! Genious! Estaba estúpidamente haciendo el habitual 'return ($ a == $ b)? 0: (($ a <$ b)? 1: -1); ' – Andris

+5

Esta implementación está [rota] (http://ideone.com/N5v06H) igual que en muchos otros idiomas. – aioobe

3

Yo no lo llamaría sucia per se, parece lo suficientemente válida. Pero no puedo pensar dónde usaría esa función. Mi única sugerencia podría ser incluir 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; 
} 
1

A primera vista, sí se siente sucio. Excepto que debe haber un bien razón por la que escribió que en lugar de simplemente usar los operadores actuales ==, > y <. ¿Cuál fue la motivación para crear esta función?

Si fuera yo, probablemente me acaba de hacer algo como:

$x = $a==$b ? 0 : ($a>$b ? 1 : ($a<$b ? -1 : null)); 

Comprendo que esto es tan feo, y el : null; - no estoy seguro si PHP lo requiere o si podría haber hecho solo :; pero no me gusta y ese código nunca debería ejecutarse de todos modos ... ¡Creo que estaría mucho menos confundido si supiera los requisitos originales!

+0

+1, probablemente no hubo motivación aquí, 'intcmp' no tiene mucho sentido en PHP. –

+0

@Andy E: Estoy * adivinando * que la motivación era una función que producía resultados similares a 'strcmp', pero tendría que entender el escenario que condujo a esa idea. – FrustratedWithFormsDesigner

+2

La idea era ayudar a clasificar una matriz javascripts de múltiples dimensiones. –

10

Usted podría utilizar

function intcmp($a,$b) 
    { 
    return ($a-$b) ? ($a-$b)/abs($a-$b) : 0; 
    } 

Aunque no veo el punto en el uso de esta función en absoluto

+2

+1, ¡listo! :-) – FrustratedWithFormsDesigner

+2

+1 para la miniaturización! – JYelton

+0

¡Esto funcionó como un encanto! ¿Crees que funciona dentro del contexto de la clase? ¿O habría una mejor implementación? ¡Todavía no he encontrado un buen estándar para ordenar matrices multidimensionales! –

3

¿Tiene que ser +1 y -1? Si no, simplemente devuelva (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; 
+0

IMO apilamiento de operadores ternarios es una práctica deficiente. En este caso, tenemos un problema con el orden de las operaciones. Corrección: return (int) $ a> (int) $ b? 1: ((int) $ a == (int) $ b? 0: -1); – msun

+0

¿PHP tiene un orden diferente de operadores que C? ¿De qué otro modo el intérprete analizaría esta declaración sin los paréntesis añadidos? – tomlogic

+0

Sí, la asociatividad del operador ternario en PHP está rota: http://phpsadness.com/sad/30 – MazeChaZer

5

Simplemente como información adicional, ha habido un RFC aceptado para esto (https://wiki.php.net/rfc/combined-comparison-operator).

Por lo tanto, la función de comparación sería lo largo de las líneas de ...

<?php 
$data = [...]; 
usort($data, function($left, $right){ return $left <=> $right; }); 
?> 

unos pocos realmente buena característica es que la comparación se hace exactamente de la misma manera que todas las otras comparaciones. Así que el malabarismo tipo sucederá como se espera.

Hasta el momento, no existe un 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.

Aún no está integrado en PHP-NG (PHP 7 en este momento), pero con suerte lo estará pronto.

+0

¡Yesss, operador de nave espacial! – Owen

3

¿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 

prueba aquí: https://3v4l.org/pSANR

+0

¿Por qué esta respuesta tiene tan pocos votos? –

+0

Esto también funciona para todos los casos cuando solo el primer o segundo parámetro es una cadena. – GreeKatrina