如何以顺序模式对 PHP 数组进行数字排序

How do I sort a PHP array numerically in a sequential pattern

感谢观看,

我有一个 PHP 数组 $array = array(1,1,1,2,3,2,3,4,5,4,4,4,5,1,2,2,3);,我正在尝试以重复的顺序模式对它进行排序,其中最大的集合在前。

在上面的数组中,我有最高值 5,它出现了两次,所以前两组会 1,2,3,4,5 然后它会恢复到第二个,最高值组等

我想以 1,2,3,4,5,1,2,3,4,5,1,2,3,4,1,2,4 结束。

任何正确方向的指示将不胜感激。

更新:我很确定我可以将数组拆分为整数值块,然后从每个子数组中顺序挑选一个项目,直到没有剩余的项目,但我只是觉得这会降低性能和我不想错过 PHP 已经可以处理的简单技巧。

这是我尝试使用流程进行非常手动的循环,其想法是简单地将数字分类到 array_unshifting 的容器中。我敢肯定这很糟糕,我希望有人能在五行或更少的时间内完成此操作:)

$array = array(1,1,1,2,3,2,3,4,5,4,4,4,5,1,2,2,3);
sort($array);
// Build the container array
$numbers = array_fill_keys(array_unique($array),array());
// Assignment
foreach( $array as $number )
{
  $numbers[ $number ][] = $number;
}

// Worker Loop
$output = array();
while( empty( $numbers ) === false )
{
  foreach( $numbers as $outer => $inner )
  {
    $output[] = array_shift( $numbers[ $outer ] );
    if( empty( $numbers[ $outer ] ) )
    {
      unset( $numbers[ $outer ] );
    }
  }
}

var_dump( $output );

您只能使用线性逻辑来使用 php 函数进行排序。这是填充数据结构的优化方式。它可以用于流、生成器或任何其他你可以迭代和比较的东西。

$array = array(1,1,1,2,3,2,3,4,5,4,4,4,5,1,2,2,3);
sort($array);
$chunks = [];
$index = [];
foreach($array as $i){
    if(!isset($index[$i])){
        $index[$i]=0;
    }
    if(!isset($chunks[$index[$i]])){
        $chunks[$index[$i]]=[$i];
    } else {
        $chunks[$index[$i]][] = $i;
    }
    $index[$i]++;
}
$result = call_user_func_array('array_merge', $chunks);
print_r($result);

我认为我不会将其视为排序问题,而是将多个列表中的值交替考虑,因此与其提出不同的数字集,不如将相同的数字集个数.

因为一个1和另一个1没有区别,你真正需要的只是计算每个出现的次数。事实证明 PHP 可以用 aaray_count_values.

为你做到这一点
$sets = array_count_values ($input);

然后我们可以通过按键排序来确保这些集合是有序的:

ksort($sets);

现在,我们循环我们的集合,倒数我们输出每个数字的次数。一旦我们有了 "drained" 个集合,我们就将它从列表中删除,一旦我们没有剩下的集合,我们就全部完成了:

$output = [];
while ( count($sets) > 0 ) {
    foreach ( $sets as $number => $count ) {
        $output[] = $number;
        if ( --$sets[$number] == 0 ) {
            unset($sets[$number]);
        }
     }
 }

此算法可以适用于值实际上不同但可以放入集合中的情况,方法是将每个集合的值设为列表而不是计数。而不是 -- 你会使用 array_shift,然后检查集合的长度是否为零。

<?php

$array = array(1,1,1,2,3,2,3,4,5,4,4,4,5,1,2,2,3);
sort($array);

while($array) {
    $n = 0;
    foreach($array as $k => $v) {
        if($v>$n) {
            $result[] = $n = $v;
            unset($array[$k]);
        }
    }
}

echo implode(',', $result);

输出:

1,2,3,4,5,1,2,3,4,5,1,2,3,4,1,2,4