首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数组平分取决于给定年份的数量。

将数组平分取决于给定年份的数量。
EN

Stack Overflow用户
提问于 2022-11-15 19:28:33
回答 2查看 48关注 0票数 -1

我有一个包含课程列表的数组

代码语言:javascript
复制
$courses = ['php', 'mysql', 'java', 'ruby'];

我也有一个函数来帮助我把这个数组分割成几个部分,这取决于给出的年数。

这是我的职责:

代码语言:javascript
复制
public function planner($courses, $periodicity, $preserve_keys = null)
{
    $nbr = (int) ceil(count($courses) / $periodicity);

    if($nbr > 0){
       return array_chunk($courses, $nbr, $preserve_keys);
    }
    return $courses;
}

如果我在参数中传递数字1或2或4,那么输出是很好的--只有当我将数字3作为$periodicity传递时,才会有错误,而数组中有4个课程

我得到:

代码语言:javascript
复制
[
  [
    'php',
    'mysql'
  ],
  [
    'java',
    'ruby'
  ]
]

如你所见,我每年都有2门课,因为我通过了3门周期性课程。

这种情况的预期结果应是:

代码语言:javascript
复制
[
  [
    'php'
  ],
  [
    'mysql'
  ],
  [
    'java',
    'ruby'
  ]
]

  • 1课程为第一年,
  • 1课程为第二年,
  • 2课程为去年
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-15 19:54:01

这稍微不同地解决了它。

首先是分割偶数段,这是用相同数量的元素分割的第一组元素(您的示例中的前2项)。还要注意的是,我没有使用ceil(),而是使用floor()来舍入值。

然后将剩余的元素添加到数组末尾的一个块中。

代码语言:javascript
复制
function planner($courses, $periodicity, $preserve_keys = false)
{
    $nbrDays = (int) floor(count($courses) / $periodicity);

    if ($nbrDays > 0) {
        $initialSplit = array_slice($courses, 0, $nbrDays * ($periodicity - 1), $preserve_keys);
        $split = array_chunk($initialSplit, $nbrDays, $preserve_keys);
        // Add in the remaining elements
        $split[] = array_slice($courses, $nbrDays * ($periodicity - 1), null, $preserve_keys);
        return $split;
    }
    return $courses;
}
票数 0
EN

Stack Overflow用户

发布于 2022-11-15 20:31:46

你可以很容易地扩展模数。但复杂的事情是把剩下的东西放在底部。

代码语言:javascript
复制
$planner = function (array $plans, int $periods): array {
    $result = [];
    $i      = 0;
    $remain = count($plans) % $periods;
    $last   = count($plans) - $remain;
    while ($plan = current($plans)) {
        if ($last === $i) break;
        $result[$i++ % $periods][] = $plan;
        next($plans);
    }
    while ($remain-- > 0) {
        $result[$i - 1][] = current($plans);
        next($plans);
    }
    return $result;
};

echo json_encode($planner(['php', 'mysql', 'java', 'ruby'], 1)), "\n";
echo json_encode($planner(['php', 'mysql', 'java', 'ruby'], 2)), "\n";
echo json_encode($planner(['php', 'mysql', 'java', 'ruby'], 3)), "\n";
echo json_encode($planner(['php', 'mysql', 'java', 'ruby'], 4)), "\n";

输出

代码语言:javascript
复制
[["php","mysql","java","ruby"]]
[["php","java"],["mysql","ruby"]]
[["php"],["mysql"],["java","ruby"]]
[["php"],["mysql"],["java"],["ruby"]]

不同结果的替代版本

这里有一个更简单的版本,如果你不需要剩下的在底部。

代码语言:javascript
复制
$planner = function (array $plans, int $periods): array {
    $result = [];
    $i      = 0;
    foreach ($plans as $plan) {
        $result[$i++ % $periods][] = $plan;
    }
    return $result;
};

echo json_encode($planner(['php', 'mysql', 'java', 'ruby'], 1)), "\n";
echo json_encode($planner(['php', 'mysql', 'java', 'ruby'], 2)), "\n";
echo json_encode($planner(['php', 'mysql', 'java', 'ruby'], 3)), "\n";
echo json_encode($planner(['php', 'mysql', 'java', 'ruby'], 4)), "\n";

输出

代码语言:javascript
复制
[["php","mysql","java","ruby"]]
[["php","java"],["mysql","ruby"]]
[["php","ruby"],["mysql"],["java"]]
[["php"],["mysql"],["java"],["ruby"]]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74451166

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档