我正在寻找优雅的方法来对存储在一个数组中的三个值中的两个进行排序。第三个可以被忽略,但我不想放松它(因此不能选择)。
想象一下这样的数组:
$r = Array("tree_type" => 1, "tree_height" = 5, "tree_age" = 2);
如果tree_height比较大,那么我想用tree_age交换树高,所以树高总是小于年龄。
现在我按照这样排序:
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);
答案 0 :(得分:1)
您可以将代码包含在函数中:
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);
另一个优雅的解决方案:(基于Is there a PHP function for swapping the values of two variables?)
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']);
}
}
答案 1 :(得分:0)
这可能有用(未经测试):
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');