所以我们在PHP中使用了这个函数
strcmp(string $1,string $2) // returns -1,0, or 1;
我们不要有一个intcmp();所以我创建了一个:
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;
}
这只是感觉很脏。你们都在想什么?
这是通过传入的排序值对Javascripts进行排序的类的一部分。
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;
}
....
}
答案 0 :(得分:95)
使用以下方式对数据进行排序:
function sortScripts($a, $b)
{
return $a['order'] - $b['order'];
}
如果您想要颠倒顺序,请使用$ b- $ a。
如果有问题的数字超过PHP的整数范围,return ($a < $b) ? -1 : (($a > $b) ? 1 : 0)
会更健壮。
答案 1 :(得分:12)
您可以使用
function intcmp($a,$b)
{
return ($a-$b) ? ($a-$b)/abs($a-$b) : 0;
}
虽然我没有看到使用此功能的重点
答案 2 :(得分:8)
为什么重新发明轮子? 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
在此测试: https://3v4l.org/pSANR
答案 3 :(得分:7)
纯粹作为一些额外的信息,已经有一个公认的RFC(https://wiki.php.net/rfc/combined-comparison-operator)。
所以,比较函数将是......
<?php
$data = [...];
usort($data, function($left, $right){ return $left <=> $right; });
?>
这里的一些非常好的功能是比较完全与所有其他比较完成相同。所以类型杂耍将按预期发生。
到目前为止,还没有允许对象公开比较值的魔术__forCompare()方法。当前的提议(一个不同的RFC)是在比较期间将每个对象注入到每个其他对象中,以便它进行比较 - 这对我来说似乎很奇怪 - 递归和堆栈溢出的潜在机会......!我会想到要么注入对象类型进行比较(允许对象能够根据比较的类型表示适当的值),要么盲目请求对象可以提供用于比较的值,这样会更安全溶液
尚未集成到PHP-NG(目前是PHP 7),但希望很快就能完成。
答案 4 :(得分:4)
它必须是+1和-1吗?如果没有,请返回(int) $a - (int) $b
。我不喜欢别人推荐的分歧,也没有必要检查所有三种情况。如果不是更大且不相等,则必须小于。
return (int) $a > (int) $b ? 1 : (int) $a == (int) $b ? 0 : -1;
答案 5 :(得分:3)
我不会把它称为脏本身,似乎足够有效。但我想不出我会在哪里使用这个功能。我唯一的建议可能是加入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;
}
答案 6 :(得分:1)
乍一看,是的,感觉很脏。除了必须有一个良好的原因之外,您不必使用实际的==
,>
和<
运算符。创建此功能的动机是什么?
如果是我,我可能只会做一些事情:
$x = $a==$b ? 0 : ($a>$b ? 1 : ($a<$b ? -1 : null));
我意识到这同样丑陋,: null;
- 不确定PHP是否需要它,或者我是否可以完成:;
但是我不喜欢它并且代码永远不会执行无论如何......如果我知道最初的要求,我想我会对此感到困惑!
答案 7 :(得分:0)
对于字符串
bookData.removeAll(where: {bookData.contains(bookDetail)})
orderFlag => 1(升序):-1(降序)
数字
usort($points, function ($a, $b) use ($orderFlag, $key1, $key2) {
return strcmp($a[$key1][$key2], $b[$key1][$key2]) * $orderFlag;
});
orderFlag => 1(升序):-1(降序)