如何以顺序模式对 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
感谢观看,
我有一个 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