2017-03-17 174 views
3

我有2个属性的对象的阵列的键:ID和名称(类名:为MyObject):检索对象

class MyObject { 
    public id; 
    public name; 
} 

我有一个数组“MyObjects”,其中每个项目是一个为MyObject实例。

我在这个数组中循环显示一个视图(MVC Web应用程序)中的所有对象。

在另一个地方(视图和控制器(验证类)之外),我将需要一个只包含所有对象的ID的数组。我现在正在做的仅仅是使用在控制器中循环的私有方法,通过“MyObjects”再次把IDS中的数组:

private function getMyObjectsIds($myObjects) { 
     $myObjectsIds = array(); 
     foreach ($myObjects as $myObject) { 
     $myObjectsIds[] = $myObject->id; 
     } 

     return $myObjectsIds; 
    } 

我的问题: 是否有更好的方法来检索的ID所有的对象作为一个数组? 我不觉得这是控制器的工作,我宁愿不将MyObjects保存在模型的新属性中,只使用模型中的相同方法。

感谢

回答

1

您可以创建如该逻辑封装自己的 “阵列” 类。

例如:

class Collection 
{ 
    public $items; 

    public function __construct(array $items) 
    { 
     $this->items = $items; 
    } 

    public function lists($name) 
    { 
     return array_map(function ($item) use ($name) { 
      return $item->{$name}; 
     }, $this->items); 
    } 

    // Other common methods 
} 

要获得ID列表。

$myObjects = new Collection([]); 
$ids = $myObjects->lists('id'); 

这不是一个完整的例子,因为你还需要实现Serializable接口和Iterator接口,所以它像一个数组。

+0

非常感谢。正是我需要的。 –

3

我会用array_map它:

$myObjectsIds = array_map(function($item) { 
    return $item->id; 
}, $myObjects); 

http://php.net/manual/en/function.array-map.php

+0

我喜欢你的答案。虽然它回答了这个问题,但Kaspars的回答更加完整。 –