我正在寻找一种优雅的方法来对存储在一个数组中的三个值中的两个进行排序。第三个可以忽略,但我不想失去它(所以取消发送不是一个选项)。
想象一下这样的阵列:
$r = Array("tree_type" => 1, "tree_height" = 5, "tree_age" = 2);
如果树高更大,那么它就是年龄,我想用树高交换树高,所以树高总是比年龄小的数字。
现在我这样排序:
if ( $r['tree_height'] > $r['tree_age'] ) {
$tmp = $r['tree_height'];
$r['tree_height'] = $r['tree_age'];
$r['tree_age'] = $tmp;
}
它运行得很好,但我正在寻找更优雅的方式。最好的解决方案是这样的:
fname($r, $r['tree_height'], $r['tree_age']);
如果第二个参数大于第三个参数,则fname总是将第二个自变量与第三个自变量交换,否则将毫无作用。
如有任何建议,我们将不胜感激。Kalreg。
答案:
无条件的最短答案是:
$tmp = Array($r['tree_height'], $r['tree_age'])
sort($tmp);
您可以将代码封装到一个函数中:
function swap(&$arr){ //NOTE SIGN & meaning passing by reference.
if ($arr['tree_height'] > $arr['tree_age']){
$cache_age = $arr['tree_age'] ;
$arr['tree_age'] = $arr['tree_height'] ;
$arr['tree_height'] = $cache_age ;
}
}
$r = array("tree_type" => 1, "tree_height" => 5, "tree_age" => 2);
swap($r);
var_dump($r);
另一个优雅的解决方案:(基于是否有用于交换两个变量值的PHP函数?)
function swap(&$arr){ //NOTE SIGN & meaning passing by reference.
if ($arr['tree_height'] > $arr['tree_age']){
list($arr['tree_height'], $arr['tree_age']) = array($arr['tree_age'], $arr['tree_height']);
}
}
这可能有效(未测试):
function fname(&$a, &$b) {
if ($a <= $b)
return;
$t = $a;
$a = $b;
$b = $t;
}
fname($r['tree_height'], $r['tree_age']);
编辑:也许你想要这样的东西?
function fname(&$array, $name1, $name2) {
if ($array[$name1] <= $array[$name2])
return;
$t = $array[$name1];
$array[$name1] = $array[$name2];
$array[$name2] = $t;
}
fname($r, 'tree_height', 'tree_age');