感谢您的关注,
我有一个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已经可以处理的简单技巧。
答案 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