我必须对数组对象进行排序(全部属于同一类);每个对象都具有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 ] );
}
}
但是我有一种直觉,认为这种效率低下,如果没有排序解决方案,它当然会永远运行下去。
正在寻求有关如何更好和/或更稳健地执行此操作的建议。
答案 0 :(得分:1)
@update发现以前的答案不正确。
看看下面的代码-https://www.tehplayground.com/CcHyHA54oYhyKmDi 您可能需要运行几次,因为当无法按照我们需要的方式对数组进行排序时,它将引发异常。