从laravel集合

时间:2016-04-18 08:00:42

标签: php mysql laravel collections

我有一个来自我的mysql数据库的项目数据集合,我有一年中的几个月的数组,我想根据项目created_at属性将每个项目移动到正确的mmonth数组中。

到目前为止,我有这个,

$months = array();
$projects = $organisation->projects->filter(function($project){
    $months[date('n', strtotime($project->created_at)) - 1][] = $project;
});

我希望这会产生类似的东西,

0 => array(
    'Project 1',
    'Project 2,
    '...'
),
1 => array(),
2 => array(),
3 => array(),
4 => array(),
5 => array(), 
6 => array(),
7 => array(),
8 => array(),
9 => array(),
10 => array(),
11 => array()

所以基本上我想过滤我的集合并将1月份开始的项目放入数组的第一个条目,以及在数组的最后一个月开始于dec的项目,但我得到的所有项目都是空数组,如果我返回项目集合,它充满了项目thoujgh。

3 个答案:

答案 0 :(得分:0)

您提供的代码的问题

$months = array();
$projects = $organisation->projects->filter(function($project){
    $months[date('n', strtotime($project->created_at)) - 1][] = $project;
});

是匿名函数中的变量$months与外部变量$months不同。这就是你的匿名函数什么都不做的原因。

请查看documentation for anonymous functions

  

闭包还可以从父作用域继承变量。任何这样的   变量必须传递给使用语言构造。

这是PHP与JavaScript不同的地方,例如。您需要声明要在闭包中使用的外部变量,以使它们可用。

另一个重要的注意事项是你应该通过引用&$months继承变量。

我认为代码应该是

$months = array();
$projects = $organisation->projects->filter(function($project) use (&$months) {
    $months[date('n', strtotime($project->created_at)) - 1][] = $project;
});

答案 1 :(得分:0)

$months = array();
$projects = $organisation->projects->filter(function($project){
    $months[date('n', strtotime($project->created_at)) - 1][] = $project;
});

而不是尝试如下:

$months = array();
$projects = $organisation->projects->filter(function($project) use ($months){
    $months[date('n', strtotime($project->created_at)) - 1][] = $project;
});

由于$months是外部变量,您想在内部函数中使用

答案 2 :(得分:0)

这是示例代码可以帮助您。

$projects = $organisation->projects->groupBy(function($project,$key){
     return date('n', strtotime($project->created_at));
});