PHP无法取消设置对象内的数组元素

Posted

技术标签:

【中文标题】PHP无法取消设置对象内的数组元素【英文标题】:PHP can't unset array element inside object 【发布时间】:2015-01-18 04:51:23 【问题描述】:

我查看了所有关于取消设置元素的问题,我没有犯任何错误,但取消设置后该元素仍然存在。

更新:我已将 RichardBernards 的建议纳入下方,但这仍在发生:

    foreach($oldObject AS $key1=>$val1)
    
        if (!empty($val1)) 
        
            $newObject->$key1 = $val1;
            if (is_array($oldObject->$key1)) 
            
                foreach ($oldObject->$key1 as $key2 => $val2) 
                
                    if (empty($val2)) 
                    
                        print('Found to be empty: unsetting newObject->' . $key1 . '[' . $key2 . ']');
                        unset($newObject->$key1[$key2]);
                        if (array_key_exists($key2, $newObject->$key1)) 
                        
                            print('The key ' . $key2 . ' still exists. What is going on?');
                        
                     
                
            
        
    

在这段代码中,文本“密钥仍然存在。这是怎么回事?”每次都在打印。

我必须取消设置空元素,因为我正在使用对象进行 SOAP 调用,如果对象中有任何空字符串,SOAP 会拒绝该对象。但是为什么$newObject->$var[$key] 在我明确取消设置后仍然存在?

是因为我试图取消设置对象内的数组元素吗?

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

这是因为您在数组上取消设置 foreach 中的变量...这是不可能的。解决这个问题的最简单方法是复制数组并 foreach 覆盖第一个数组,删除第二个数组中的键...然后在代码中进一步使用第二个数组。

很长的路要走是通过使用诸如 array_walk() 之类的函数或将要取消设置的键存储在不同的数组中并在 foreach 之后取消设置...

【讨论】:

感谢您的帮助。由于无论如何我都是从旧对象中复制数据,因此我尝试遍历旧对象中的数组,但似乎仍然得到相同的结果。 数组是作为引用传递而不是复制吗?我从来没有完全弄清楚引用在 php 中是如何工作的。在 Java 中这很容易。

以上是关于PHP无法取消设置对象内的数组元素的主要内容,如果未能解决你的问题,请参考以下文章

PHP - 在foreach循环中取消设置数组元素[重复]

如何在php中取消设置数组元素匹配索引?

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

取消设置 php 参考

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

取消设置操作后将PHP数组索引重置为从0开始[重复]