Php 在foreach循环中访问对象的$key

Php 在foreach循环中访问对象的$key,php,arrays,oop,object,foreach,Php,Arrays,Oop,Object,Foreach,自从我开始用OOP编写更多的代码以来,我总是遇到一个在我看来的代码样式问题。我想向现有对象添加一些附加数据。当我使用数组时,foreach很容易做到这一点,因为每个数组项都有自己的键。现在,对于对象,我没有找到一种方法,可以用一个键访问每个项目 $data_items = $this->model->get_function(); $data_items = (array) $data_items; foreach ($data_items as $key => $row) {

自从我开始用OOP编写更多的代码以来,我总是遇到一个在我看来的代码样式问题。我想向现有对象添加一些附加数据。当我使用数组时,foreach很容易做到这一点,因为每个数组项都有自己的键。现在,对于对象,我没有找到一种方法,可以用一个键访问每个项目

$data_items = $this->model->get_function();
$data_items = (array) $data_items;
foreach ($data_items as $key => $row)
{
      $data_items[$key]['additional_data'] = 'additional_data';                      
}
$data_items = (object) $data_items;
我认为我的代码只是一种变通方法。有人能告诉我我是否能摆脱代码行$data\u items=array$data\u items;和$data\u items=对象$data\u items

感谢所有回答我问题的人

直到现在,我才意识到我想要实现的目标是如此简单:

foreach ($data_items as $row)
{
    $row->additional_data = 'additional_data';
}
foreach($objectList as &$obj){
    $obj->newProperty = 'whatever';
}

从数据处理的角度来看,对象和数组看起来几乎相同。您可以简单地添加另一个对象属性并将数据保存到其中,而无需声明所述属性。在我看来,这是一个缺点,但在您的情况下,这是一个优点

数组:

$arr = array();
$arr['additional_data'] = 'foo';
对象:

$obj = new stdClass;
$obj->additional_data = 'bar';
Foreach处理对象属性的方式与处理数组键的方式相同。 而且不需要隐式铸造

以下是无铸造变体:

$data_items = $this->model->get_function();
foreach ($resource_contacts as $key => $row)
{
      // Note, $data_items->{$key} must be an object, or this will crash.
      // You can check if it is with is_object() and react accordingly
      $data_items->{$key}->additional_data = 'additional_data';                      
}

从数据处理的角度来看,对象和数组看起来几乎相同。您可以简单地添加另一个对象属性并将数据保存到其中,而无需声明所述属性。在我看来,这是一个缺点,但在您的情况下,这是一个优点

数组:

$arr = array();
$arr['additional_data'] = 'foo';
对象:

$obj = new stdClass;
$obj->additional_data = 'bar';
Foreach处理对象属性的方式与处理数组键的方式相同。 而且不需要隐式铸造

以下是无铸造变体:

$data_items = $this->model->get_function();
foreach ($resource_contacts as $key => $row)
{
      // Note, $data_items->{$key} must be an object, or this will crash.
      // You can check if it is with is_object() and react accordingly
      $data_items->{$key}->additional_data = 'additional_data';                      
}

如果对象实现了可遍历接口ArrayAccess,Iterable,如stdClass,则可以轻松访问实例:

$foo = new stdClass;
$foo->bar = 'foobar';
foreach($foo as $property => $value)
{
    echo '$foo->'.$property.' === '.$value;
    echo $foo->{$property} = 'reassign';
}
如果不实现这些接口,您仍然可以迭代任何对象,但是:只有公共属性是可见的。
为了解决这个问题,我倾向于将我的所有属性声明为受保护,并让我的所有数据对象继承自一个实现迭代器接口的抽象模型,因此我不必担心它。

如果对象实现可遍历接口ArrayAccess,Iterable,如stdClass,您可以轻松地访问该实例:

$foo = new stdClass;
$foo->bar = 'foobar';
foreach($foo as $property => $value)
{
    echo '$foo->'.$property.' === '.$value;
    echo $foo->{$property} = 'reassign';
}
如果不实现这些接口,您仍然可以迭代任何对象,但是:只有公共属性是可见的。
为了解决这个问题,我倾向于将我的所有属性声明为受保护,并使我的所有数据对象继承自实现迭代器接口的抽象模型,因此我不必担心它。

您应该能够执行以下操作:

$data_items = $this->model->get_function();
foreach ($resource_contacts as $key => $row)
{
      $data_items->$key->additional_data = 'additional_data';                      
}

您应该能够执行以下操作:

$data_items = $this->model->get_function();
foreach ($resource_contacts as $key => $row)
{
      $data_items->$key->additional_data = 'additional_data';                      
}

使用引用可以修改foreach循环中的对象,如果这是您试图实现的:

foreach ($data_items as $row)
{
    $row->additional_data = 'additional_data';
}
foreach($objectList as &$obj){
    $obj->newProperty = 'whatever';
}

使用引用可以修改foreach循环中的对象,如果这是您试图实现的:

foreach ($data_items as $row)
{
    $row->additional_data = 'additional_data';
}
foreach($objectList as &$obj){
    $obj->newProperty = 'whatever';
}


对象的ArrayAccess接口。是什么阻止您直接在对象上执行foreach?因为您没有尝试在没有magic方法的情况下将对象强制转换为字符串或整数,所以您可以在对象中循环-foreach只在数组和objectsoop上工作非常好,但是使用php stdclass对象并没有任何oops好处。在php中,在存储值集合时,您应该始终支持常规数组而不是stdclass对象,因为该语言为对象的arrays.ArrayAccess接口提供了最佳支持。是什么阻止您直接在对象上执行foreach?因为您没有尝试在没有magic方法的情况下将对象强制转换为字符串或整数,所以您可以在对象中循环-foreach只在数组和objectsoop上工作非常好,但是使用php stdclass对象并没有任何oops好处。在php中,在存储值集合时,您应该总是喜欢使用常规数组而不是stdclass对象,这仅仅是因为该语言为array.quirier提供了最佳支持。我一直在使用我自己的类,从来没有含蓄地声明它们实现了这些属性中的任何一个。Foreach刚刚开始工作。我有没有遗漏一些更大的画面?但作者不是在尝试一种我们不知道是什么的方法吗returns@MaximKumpan:隐式迭代仅允许访问公共properties@RoyalBg:OP想要获得演员的rif,如果他没有使用PHP5.4+,除了将返回值分配给tmp变量之外,没有其他选择。它位于类内部。但假设是:$a=新类$b=$a->method$b应该获取stdClass的实例,以便对其进行foreach吗?好奇。我一直在使用我自己的类,从来没有含蓄地声明它们实现了这些属性中的任何一个。Foreach刚刚开始工作。我有没有遗漏一些更大的画面?但作者不是在尝试一种我们不知道是什么的方法吗returns@MaximKumpan:隐式迭代仅允许访问公共properties@RoyalBg当前位置OP想要得到演员的rif,如果他不在
PHP5.4+,除了将返回值赋给tmp变量之外,别无选择。它位于类内部。但假设是:$a=新类$b=$a->method$b应该获取stdClass的实例才能对其进行foreach吗?附加的_数据在原始问题中不是变量。PHP注意:未定义的变量:第4行PHP shell代码中的附加_数据感谢您指出,我现在删除了额外的“$”,我想我没有真正注意到这一点。OP现在已经解决了他的问题,所以我想我的修复现在有点多余了…附加的_数据在原始问题中不是变量。PHP注意:未定义的变量:第4行PHP shell代码中的附加_数据谢谢你指出,我现在删除了额外的“$”,我想我没有真正注意到。OP现在已经解决了他的问题,所以我想我的修复现在有点多余了。。。