如何对大量/对象进行排序

时间:2013-04-16 12:08:42

标签: php arrays zend-framework

我有一个巨大的$events。 为了输出这个庞大的信息,我做了:

<?php foreach ($this->events as $usern): ?><?php foreach ($usern as $user): ?>
        <tr>
            <td><?php echo $user['id']; ?></td>
            <td><?php echo $user->resource_types; ?></td>
            <td><?php echo $user->resource_ids; ?></td>
            <td><?php echo $user->action; ?></td>
            <td><?php echo $this->owner($user->originator); ?></td>
            <td><?php echo $user->event_date; ?></td>
            <td>
            <?php //if($this->canManageBusiness($user->id)): ?>

            <?php // endif ?>
            </td>
        </tr>
    <?php endforeach ?><?php endforeach ?>

有趣的是,我可以同时使用$user->id$user['id'] sintax。但是不要紧。 我如何通过$user['id'] desc?

对此进行排序

编辑: 我从数据库中获取数据,但不是通常的方式,所以我不能使用sql语法来排序结果:

$events[] =$this->_dbTable->fetchAll($this->_dbTable->select()->from($this->_dbTable, array('id','resource_types','resource_ids','action','originator','event_date'))->where('resource_types = ?', 'business')->where('resource_ids',$bus->id));
$events[] =$this->_dbTable->fetchAll($this->_dbTable->select()->from($this->_dbTable, array('id','resource_types','resource_ids','action','originator','event_date'))->where('resource_types = ?', 'document-type')->where('resource_ids',$dt->id));
return $events

4 个答案:

答案 0 :(得分:2)

您是否从数据库中读取数据?然后只需添加到您的查询SORT BY id DESC

否则你可以在PHP中使用usort():

usort($events, function ($a, $b) { return $a->id - $b->id; });

答案 1 :(得分:1)

在查询中添加order()不会让您到达那里?

$events[] =$this->_dbTable->fetchAll($this->_dbTable->select()
    ->from($this->_dbTable,
        array('id','resource_types','resource_ids','action','originator','event_date'))
    ->where('resource_types = ?', 'business')
    ->where('resource_ids',$bus->id)
    ->order('id DESC'));
$events[] =$this->_dbTable->fetchAll($this->_dbTable->select()
    ->from($this->_dbTable,
        array('id','resource_types','resource_ids','action','originator','event_date'))
    ->where('resource_types = ?', 'document-type')
    ->where('resource_ids',$dt->id)
    ->order('id DESC'));
return $events

在我看来,这一切都来自同一张表,如果是这样,为什么不建立一个查询呢?

可能是这样的:

$events[] = $this->_dbTable->fetchAll($this->_dbTable->select()
              ->from($this->_dbTable,
                   array('id','resource_types','resource_ids','action','originator','event_date'))
              ->where('resource_types IN (?)', array('business', 'document-type'))
              ->where('resource_ids IN (?)', array($bus->id, $dt->id))
              ->order('id DESC'));

不确定这是否有助于你到达那里,也许。

答案 2 :(得分:0)

这很糟糕,因为你必须经历两次清单,但你可以......

$events_arr = array();
<?php foreach ($this->events as $usern): ?><?php foreach ($usern as $user): ?>
    $events_arr[$user_id][] = $usern; endforeach; endforeach;
ksort($events_arr);

现在您可以使用事件arr,它按user_id

排序
foreach ($events_arr as $user_id => $usern) {
  foreach ($usern as $user) {
    echo $user_id . ": " . $user->action;
  }
}

答案 3 :(得分:0)

决定对我的数据库表进行denormolise以使选择数据的处理更容易。让我们看看它是否变得更好。