【问题标题】:sorting an array of objects by datetime variable按日期时间变量对对象数组进行排序
【发布时间】:2014-11-19 14:05:16
【问题描述】:

我想按日期时间变量对对象数组进行排序,日期位于未来,我想将最接近当前日期的日期作为第一个日期。

我在 symfony2 中使用以下控制器操作:

public function fixturesAction(){
        if (false === $this->get('security.context')->isGranted('IS_AUTHENTICATED_FULLY')) {
            throw $this->createAccessDeniedException('Unable to access this page!');
        }

        $user = $this->get('security.context')->getToken()->getUser();
        $team = $this->getDoctrine()
                ->getRepository('LoginLoginBundle:Team')
                ->findByUserUserid($user->getUserid());
        $matchGamesHome = $this->getDoctrine()
                        ->getRepository('LoginLoginBundle:Matchgame')
                        ->findByHometeam($team[0]->getName());
        $matchGamesAway = $this->getDoctrine()
                        ->getRepository('LoginLoginBundle:Matchgame')
                        ->findByAwayteam($team[0]->getName());

        $matchGames = array_merge($matchGamesHome, $matchGamesAway);

        $sorted = usort($matchGames, function($a, $b) {
            return $a->date->format('U') - $b->date->format('U');
        });

        return $this->render('LoginLoginBundle:Default:fixtures.html.twig', array("matchArray"=>$sorted));
    }

我在哪里进行排序:

$sorted = usort($matchGames, function($a, $b) {
                return $a->date->format('U') - $b->date->format('U');
            });

这会产生以下错误:

Error: Cannot access private property Login\LoginBundle\Entity\Matchgame::$date in C:\wamp\www\SocProNetbeans\src\Login\LoginBundle\Controller\DefaultController.php line 675 

第 675 行如下:

return $a->date->format('U') - $b->date->format('U');

对这个数组进行排序的正确方法是什么?

【问题讨论】:

    标签: php arrays sorting symfony datetime


    【解决方案1】:

    由于我不知道错误说的是哪一行,所以这是在黑暗中的一个小镜头:

    替换

    return $a['date']->format('U') - $b['date']->format('U');
    

    return $a->date->format('U') - $b->date->format('U');
    

    【讨论】:

    • 我已经替换了它,但现在我得到一个不同的错误,我编辑了 OP
    • 错误是不言自明的... date 属性在使用的类/对象中是私有的...您可以将其设置为 public 或查看是否有 'getter ' 喜欢 getDate() 为这个属性
    • 是的,已经想到了,但是现在当我执行 var_dump($sorted) 时,我只会得到 'boolean true' ...
    • @HardUser 没错... $matchGames 已排序,成功时usort() 的返回值为真... 见php.net/usort
    • 我明白了,我现在明白了一切,一切正常,谢谢! :p
    【解决方案2】:
    1. 您的数据库架构似乎很糟糕。 LoginLoginBundle:Matchgame 有两个属性 hometeamawayteam 存储相关团队的名称。为什么不是 ID?这是一个OneToMany/ManyToOne association,应该由学说管理。
    2. ->findByUserUserid 你想得到一排。所以应该是->findOneByUserUserid(但为什么是user_userid??)
    3. 数据库针对排序进行了高度优化。让数据库完成这项工作。
    4. 您可以编写相当复杂的 DQL 查询。为您的方法编写一个自定义表存储库。

    这个查询应该做你想做的,但同样:首先改进数据库架构!

    $query = $em->createQuery('
        SELECT g
        FROM LoginLoginBundle:Matchgame g
        WHERE g.hometeam = :hometeam
           OR g.awayteam = :awayteam
        ORDER BY g.date ASC
    ');
    $query->setParameter('hometeam', $team);
    $query->setParameter('awayteam', $team);
    $matches = $query->getResult();
    

    【讨论】:

    • 嘿,是的,我认为我的架构并不完美,但是这对我个人来说是一个学习项目,数据库并不是我的强项。我将尝试按照您所说的更新架构,但这是我第一次使用 mysql,所以会很痛苦:p
    猜你喜欢
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 2011-10-30
    相关资源
    最近更新 更多