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

时间:2018-06-30 10:58:37

标签: php arrays sorting sequential

感谢您的关注,

我有一个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已经可以处理的简单技巧。

4 个答案:

答案 0 :(得分:1)

这是我尝试使用过程进行非常手动的循环,其想法是将数字简单地排序到用于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 );

答案 1 :(得分:1)

我认为我不会将其视为排序问题,而是将多个列表中的值交替出现,因此我不会提出一组不同的数字,而是将一组相同的数字

由于1和1之间没有区别,所以您实际需要的是计算每个1出现的次数。事实证明,PHP可以使用aaray_count_values为您做到这一点。

$sets = array_count_values ($input);

然后我们可以通过按键排序来确保集合顺序正确:

ksort($sets);

现在,我们遍历集合,计算每个数字输出多少次。一旦我们“耗尽”了一个集合,就将其从列表中删除,并且一旦我们没有剩下的集合,我们就完成了:

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

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

答案 2 :(得分:0)

您只能使用线性逻辑来使用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);

答案 3 :(得分:0)

<?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