【问题标题】:How do you arrange PHP objects into arrays for display如何将 PHP 对象排列成数组以进行显示
【发布时间】:2014-01-11 03:01:01
【问题描述】:

我是一名 PHP 开发人员,通常使用数组代替对象,我想知道是否有任何基于键值的对象操作的最佳实践。

采用以下多维事件数组,这是您直接从数据库中提取的典型事件。

$events = array(
   0=>array(
      'eventid'=>1,
      'title'=>'First Event',
      'date'=>'20131010'
   ),
   1=>array(
      'eventid'=>2,
      'title'=>'Second Event',
      'date'=>'20131022'
   ),
   2=>array(
      'eventid'=>3,
      'title'=>'Third Event',
      'date'=>'20131010'
   ),
),

为了在我的模板中显示,我想首先根据日期将其设为多维数组。这是相当简单的转换,我使用了辅助函数。

assoc($events,'date','eventid');

导致:

$events = array(
   20131010=>array(
       1 => array(
           'eventid'=>1,
           'title'=>'First Event',
           'date'=>'20131010'
       ),
       3 => array(
           'eventid'=>3,
           'title'=>'Third Event',
           'date'=>'20131010'
       ),
   ),
   20131022=>array(
       2 => array(
           'eventid'=>1,
           'title'=>'First Event',
           'date'=>'20121010'
       ),
   ),
),

通过这种方式,我可以轻松地在模板端为每个日期运行数组,为该日期创建一个标题,然后在下面显示当天的事件。

我可以继续尝试为对象创建一个类似的 assoc() 函数,但我觉得这应该是一个相当普遍的事情,并且可能有一个标准的方法来做到这一点。如果你有一个对象而不是 $events 的数组,你会如何按照我描述的第二种方式来格式化它,或者你会吗?

还有一条信息:我正在使用 CodeIgniter,以防它有一些我不知道可能有用的辅助函数。

【问题讨论】:

  • 对象/数组对数据的检索或排序方式没有太大影响。您所做的是常见做法,替代方法是在数据库查询中正确排序数据。
  • 你说的是 stdObject 还是自定义类?
  • nl-x,因为我不知道答案,我猜这是个问题。但是,如果我 var_dump,它说我相信 stdObject。这是从 CodeIgniter 的标准活动记录调用中检索到的内容。 $query = $this->db->get('events');返回 $query->result();

标签: php codeigniter object


【解决方案1】:

在您的 assoc 函数中,您可以进行 is_object 检查,如果它是一个对象,则将其转换为数组。

function your_assoc_func($events){
  if(is_object($events)){
    $events = (array)$events
  }

  // If the object is more complex cast any containing objects you may run across
  foreach($events as $event){
    if(is_object($event)){
      $event = (array)$event
    }
  }
}

【讨论】:

  • 是的,我可以轻松做到这一点。只是不确定这是否是常见做法。
  • 更具体地说,我想知道在需要这样的东西时将对象更改为数组是否是常见的做法。现在我更多地使用对象并且看到了很多类似 $message->title 的东西,做这个转换并突然看到 $events['title'] 似乎很奇怪。
  • 我明白你在说什么 - 你传入一个对象并取回一个数组。您可以轻松地拿着一个标志来确保您返回一个对象。我看到的唯一其他选择是声明一个自定义事件类并使其可迭代:php.net/manual/en/language.oop5.iterations.php
  • 感谢您的信息。我希望这是我的最后一个问题,这将决定我走的方向。向模板发送信息时哪个更常见?信息在发送到模板时通常是数组或对象形式。如果是前者,那么我会在传递之前将我的所有对象都放入数组中。如果是后者,我将尝试保留 objects 对象并尝试创建一个返回对象的 assoc() 函数。
  • 我认为这真的是你喜欢的任何东西。我个人喜欢将数据作为由某种 GUID 索引的对象数组来操作。这是一个非常好的讨论,我很快就发现了关于数组与对象的性能。 stackoverflow.com/questions/2193049/php-objects-vs-arrays。也许这会帮助你做出决定。
猜你喜欢
  • 2019-11-02
  • 2010-12-04
  • 2021-10-21
  • 2018-02-07
  • 1970-01-01
  • 2011-01-09
  • 2017-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多