【问题标题】:php - how to sort all elements of array except onephp - 如何对数组的所有元素进行排序,除了一个
【发布时间】:2013-12-15 22:32:41
【问题描述】:

我正在寻找一种优雅的方式来对存储在一个数组中的三个值中的两个进行排序。第三个可以忽略,但我不想松开它(所以取消设置不是一种选择)。

想象一下这样的数组:

$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 总是将第二个参数与第三个交换,否则什么也不做。

任何建议将不胜感激。 卡雷格。

回答:

无条件的最短答案是:

$tmp = Array($r['tree_height'], $r['tree_age'])
sort($tmp);

【问题讨论】:

    标签: php arrays sorting


    【解决方案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']);
      }
    }
    

    【讨论】:

    • ur answet 也使用“cache_age”并且工作方式与我上面的类似,所以很遗憾它不能解决我的问题
    • 告诉我,缓存数据有什么问题?交换多个变量的值是一种很好的做法。
    • 是的,它的工作方式与您的解决方案几乎相同,我只是将它封装到一个函数中并通过引用传递数组,使其可用。
    • 添加了另一个解决方案。检查答案。
    • 这就是重点:您需要像fname($r) 这样的解决方案,它需要使用引用传递。因此:通过引用传递会影响原始数组,否则你必须在你的函数中使用return语句。
    【解决方案2】:

    这可能有效(未经测试):

    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');
    

    【讨论】:

    • 你的答案和我的一样,只是你把它放入函数中。
    • 是的,这不是你要求的吗?
    • 请参阅答案的编辑部分。这是你要找的吗?
    • 我正在寻找更优雅、更短的东西。请记住,您需要额外的 ($t) 变量来占用内存和时间。
    • 所以如果你确定你只使用数字,你可以做加法交换或异或交换 - 仍然是三行,但没有额外的变量 :-) 它是这样的: $a = $a ^ $b; $b = $a ^ $b; $a = $a ^ $b;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-11
    • 2023-03-14
    • 1970-01-01
    • 2017-12-16
    • 2015-06-28
    • 1970-01-01
    相关资源
    最近更新 更多