【问题标题】:Split array into equal size of bunch based on values根据值将数组拆分为相等大小的束
【发布时间】:2018-02-09 10:16:29
【问题描述】:

我有一个类似的数组:

array[
  '5' => 142,
  '2' => 57,
  '18' => 37
];

我需要把这个数组分成 50 个,所以输出是:

array[
  '0' => ['5' => 50],
  '1' => ['5' => 50],
  '2' => ['5' => 42, '2' => 8],
  '3' => ['2' => 49, '18' => 1],
  '4' => ['18' => 36],
];

有人可以帮忙提供一些解决方案或逻辑或 PHP 中的任何现有功能吗?

【问题讨论】:

  • 到目前为止你得到了什么?还是您希望人们为您编写代码?
  • 更清楚你想要做什么,并发布你迄今为止尝试过的......
  • 抱歉,但我认为这是一个明确的查询,您可以同时输入和输出。我自己在做编码,所以如果你们之前可以帮助提出一些逻辑,那就太好了。询问以前是否有人做过类似的工作。

标签: php arrays arraylist


【解决方案1】:

只是智力游戏

$line = [];
// Invert array
foreach($arr as $k=>$v) {
   $line = array_merge($line, array_fill(0, $v, $k));
}
// Split and count occurrences
$res = array_map('array_count_values', array_chunk($line, 50));
print_r($res);

demo

【讨论】:

  • 谢谢!这比我的更简单、更干净:)
  • 这个说的很清楚了,但是值大的话就需要很多内存
  • 我只需要在内存方面使用高可用性服务器运行一次。
  • 很高兴为您提供帮助。祝你好运!
  • 数组函数的完美组合:)
【解决方案2】:

你可以试试这样的:

$total = [] ; $ckey = 0 ; 
foreach ($array as $key => $value) {
    while ($value) {
        $cursum = isset($total[$ckey]) ? array_sum($total[$ckey]) : 0 ;
        if ($cursum == 50) $ckey++ ;

        if ($value + $cursum > 50) $add = 50 - $cursum ;
        else  $add = $value ;

        $total[$ckey][$key] = $add ;
        $value -= $add ;
    }
}
print_r($total) ;

输出:

Array (
    [0] => Array (
            [5] => 50
        )

    [1] => Array (
            [5] => 50
        )

    [2] => Array (
            [5] => 42
            [2] => 8
        )

    [3] => Array (
            [2] => 49
            [18] => 1
        )

    [4] => Array (
            [18] => 36
        )
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多