对对象的PHP数组进行排序,以使相邻对象不共享特定的属性值

时间:2018-07-31 19:22:47

标签: php arrays sorting

我必须对数组对象进行排序(全部属于同一类);每个对象都具有type属性,该属性始终存储5个可能的整数值中的1个(为方便起见,将它们称为1-5)。在这种奇怪的用例中,必须在数组中将对象随机排序,并且必须满足以下条件:两个对象不能依次共享相同的type值。

即。如果数组是:

$objects = [$t_1, $t_1, $t_2, $t_2]

其中$t_1表示其type属性为1的对象

那么以下顺序就可以了:

$objects = [$t_1, $t_2, $t_1, $t_2]

但是初始状态不是。

我目前正在做这样的事情(逐字代码原地太混乱而无法发布,但是从逻辑上讲,这与我当前编写的代码相同):

$unsorted = $array_of_objects
$sorted = [];
while ( count( $unsorted ) ) {
    // randomly select a remaining unsorted object
    $next_index = array_rand( $unsorted );
    $next_obj   = $unsorted[ $next_index ];

    // as long as the current object's type property doesn't match the type property of the preceding obj, add it to $sorted
    if ( !count( $sorted ) or ( $next_obj->type != $sorted[ -1 ]->type ) ) {
        array_push( $sorted, $next_obj );
        unset( $unsorted[ $next_index ] );
    }           
}

但是我有一种直觉,认为这种效率低下,如果没有排序解决方案,它当然会永远运行下去。

正在寻求有关如何更好和/或更稳健地执行此操作的建议。

1 个答案:

答案 0 :(得分:1)

@update发现以前的答案不正确。

看看下面的代码-https://www.tehplayground.com/CcHyHA54oYhyKmDi 您可能需要运行几次,因为当无法按照我们需要的方式对数组进行排序时,它将引发异常。