2015-11-03 309 views
1

标题可能有点混乱,因为我不太清楚如何描述我的'数组'。下面是我使用print_r时的外观...PHP - 从stdclass对象的数组中删除一个元素

stdClass Object 
(
[0] => stdClass Object 
    (
     [Name] => Claude Bemrose 
     [Skill] => 7 
     [Age] => 14 
     [AgeWeeks] => 11 
     [ChanceOfLeaving] => 12 
    ) 

[1] => stdClass Object 
    (
     [Name] => Willy Gearon 
     [Skill] => 7 
     [Age] => 12 
     [AgeWeeks] => 27 
     [ChanceOfLeaving] => 8 
    ) 

[2] => stdClass Object 
    (
     [Name] => Kevin Broderick 
     [Skill] => 9 
     [Age] => 13 
     [AgeWeeks] => 21 
     [ChanceOfLeaving] => 12 
    ) 

它看起来像一个带有对象数组的对象。

我想删除一个元素(如全[1]),但如果我尝试使用未设置,如unset($this->U16sArray[$arrayindex])我得到...

Fatal error: Cannot use object of type stdClass as array.

我还是很困惑,如何或为什么我的'阵列'首先出现这种方式。但我很高兴以这种方式使用它,只要我可以删除元素。

根据要求提供更多信息。它是使用PDO从数据库中提取的。..

try { 
     $query = $db->prepare("SELECT * FROM Teams WHERE ID = :TeamID"); 
     $query->bindValue(':TeamID', $ID, PDO::PARAM_INT); 
     $query->setFetchMode(PDO::FETCH_INTO, $this); 
     $query->execute(); 
     $query->fetch();  
    } 

它是一个更大的对象的一部分。

然后从JSON解码的

$this->U16sArray = json_decode($this->U16sJSON); 

编辑 - 更新。

我正在慢慢追查这个问题。基本上,这一切都工作正常,直到我使用未设置的功能,在这一点上,东西被改变,保存,然后当我重新加载它,它开始抛出错误。据推测,它从一种阵列改变为另一种阵列。

例如,使用我的数据未设定功能之前,我的数据库中的数据看起来像这样...

[{“名称”:“詹姆斯花套”,“技巧”:2,“年龄“:15,”AgeWeeks“:19,”ChanceOfLeaving“:8},{”Name“:”Neil Rowlett“,”技能“:8,”年龄“:15,”AgeWeeks“:11,”ChanceOfLeaving“ }

当我执行print_r时,它显示为U16sArray - > Array。

将unset用于数据中的某处并再次保存后,数据现在看起来像这样。 {“0”:{“Name”:“James Suiter”,“Skill”:2,“Age”:15,“AgeWeeks”:20,“ChanceOfLeaving”:9},“1”:{“012”名称“:”Neil Rowlett“,”Skill“:8,”Age“:15,”AgeWeeks“:12,”ChanceOfLeaving“:4}

所以'0'和'1'已被添加。现在我的代码在各个地方都是错误的,现在print_r将它显示为U16sArray - > stdClass对象。解决方案(我认为) - 大约1/4下来的PHP:json_encode页面,我认为是答案,'simoncpu在这里'回答。显然,'取消设置元素也会删除密钥。 json_encode()现在将假定这是一个对象,并将按照这样的方式进行编码。

http://php.net/manual/en/function.json-encode.php

所以这样看来,它的正常工作,未设置的改变它的一个对象,然后当我下一次加载它,它不能作为一个数组了。

解决方法是在编码/保存之前使用array_values重新索引数组。

+0

你使用过'unset'吗? –

+1

尝试'unset($ this - > {'1'});'没有数组只是数字属性的对象。 – AbraCadaver

+0

为什么你将'stdClass'用于数组而不是仅仅使用普通数组? – Barmar

回答

0

恐怕这是很平常的事情,你可以一个”吨做得很多。它与PHP的设计方式(不)相关。基本上你不能用一个数字变量名

访问的对象属性这回答类似的问题将更好地解释: https://stackoverflow.com/a/10333200/1012699

但是,你可以投对象到一个数组和接入/删除其内容。如果你愿意的话,然后投入到物体中。 查看在PHP上型铸造该手册: http://php.net/manual/en/language.types.type-juggling.php

+0

谢谢,看起来像我需要施放/删除/重铸,或修复当时我已经形成对象/数组的方式。至少这点我指向一个方向,所以谢谢:) – Farflame

+0

我相信它会简单得多json直接作为关联数组解码并在数据处理后投射到对象 '$ this-> U16sArray = json_decode($ this - > U16sJSON,true);' –

+0

是的,这是固定的,所以它现在是一个数组。所以这有点解决问题,但我现在还有其他一些问题出现......但它们都可以解决:) – Farflame

0

这是一个奇怪的物体,不会说谎。

做这些工作吗? (假设你的print_r是的print_r($这个);)

unset($this->{1}); 
unset($this->{'1'}); 

更多信息:Is it possible to delete an object's property in PHP?

编辑:虽然,我建议改变你通过PDO得到这个信息的方式,使它是数组格式。如何做到这一点这里的更多信息:一旦你在一个阵列格式有它 PDO returning execute results to an array

,你可以简单地使用:

unset($data[1]); 
+0

是的,物体首先是奇怪的。我也许应该尝试修复它,以便它更加合理。我甚至不知道它是如何得到这种方式....解决方案不起作用,但他们不会导致错误。他们似乎什么都不做的对象/数组。 – Farflame

+0

你是如何得到这些数据的?它是否使用PDO或其他框架从数据库中提取?我可以协助将它们放入包含对象的数组中。 无论哪种方式,这是否没有工作? –

+0

$这个单词只在一个类里面 – Mihai

0

当使用json_decode可以在真

$这 - > U16sArray = json_decode的第二参数传递($这 - > U16sJSON,真) ;

结果将他们是一个数组,你可以直接使用。