取消设置对象中的属性

Posted

技术标签:

【中文标题】取消设置对象中的属性【英文标题】:Unsetting properties in an object 【发布时间】:2014-05-02 10:33:15 【问题描述】:

我正在尝试取消设置对象中的某些内容。

foreach($curdel as $key => $value) 
if ($value == $deletedinfo[0]) 
    print_r($key);
    print_r($curdel);
    unset($curdel[$key]);


正如预期的那样,$key 返回正确的值 (0),$curdel 返回整个数组。但是尝试取消设置 $curdel[$key] 会破坏一切。甚至试图 print_r($curdel[$key]) 破坏一切,我错过了什么?

我的对象如下所示:

stdClass Object ( [0] => IFSO14-03-21-14.csv [2] => EB_Bunny.jpg [3] => EB_White_Bear.jpg )

【问题讨论】:

什么意思 - 破坏一切?有任何真正的错误消息吗? 破坏一切?错误是什么? 没有错误,我尝试后没有任何渲染。 print_r $curdel 返回:stdClass Object ( [0] => IFSO14-03-21-14.csv [2] => EB_Bunny.jpg [3] => EB_White_Bear.jpg ) 所以你知道以后的问题,这个数据结构是一个具有数字属性的对象,而不是一个“对象数组”。我怀疑如果你使用这个短语,人们会认为你的意思是一个实现 Iterator 接口的类。 【参考方案1】:

代替:

unset($curdel[$key]);

试试:

unset($curdel->$key);

数组通过 [] 访问/修改,但对象和类属性通过 ->

【讨论】:

这家伙,这家伙知道怎么回事。【参考方案2】:

该问题的可能解决方案是添加对$value 变量的引用:

foreach($curdel as $key => &$value)  //Note & sign
   if ($value == $deletedinfo[0]) 
       print_r($key);
       print_r($curdel);
       unset($curdel[$key]);
   

&$value 表示对实际数组元素的引用

也基于这个(类似的)示例回答:Unset an array element inside a foreach loop

更新

基于您的输入(STDClass 而不是数组):只需先将 $curdel 转换为数组即可:

$curdel = (array) $curdel ;

对象中的数字索引有点无效,只能通过特殊语法访问,例如:

$object->'0' ;

这是一个非常糟糕的做法。

【讨论】:

foreach 和 if 似乎不是问题,因为两个 print_r 正在关闭。 说真的,只是解释一下你有什么输入以及你需要得到什么最终结果。发布更多可能导致问题的代码,我们将为您提供帮助。 Breaks everythingERROR_NOT_FOUND 相同 根据当时可用的信息,我认为这是一个很好的答案:object != object array!

以上是关于取消设置对象中的属性的主要内容,如果未能解决你的问题,请参考以下文章

取消设置循环内对象的当前属性[重复]

如何在运行时正确取消设置 PHP 中的类属性?

设置 DirectoryUrl 属性时,UIDocumentPickerViewController 中的取消按钮不可用

取消设置数组为 PHP 中的对象添加键

取消设置数组中的索引将其转换为对象

如何取消设置 NSFetchRequest 的 fetchLimit?