PHP - 从 stdclass objects 的 stdclass 数组中删除一个元素
PHP - Remove an element from a stdclass array of stdclass objects
标题可能有点混乱,因为我不太确定如何描述我的 'array'。这是我使用 print_r...
时的样子
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
)
它有点像一个 object 和一个 object 数组。
我想删除一个元素(例如整个 [1]
),但是如果我尝试使用 unset,例如 unset($this->U16sArray[$arrayindex])
我会得到 ...
Fatal error: Cannot use object of type stdClass as array.
我仍然很困惑我的 '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();
}
它是更大 object 的一部分。
然后从 JSON 解码为
$this->U16sArray = json_decode($this->U16sJSON);
编辑 - 更新。
我正在慢慢追查问题。基本上,它一切正常,直到我使用 unset 函数,此时,某些内容被更改、保存,然后当我重新加载它时,它开始抛出错误。大概是从一种数组变成了另一种数组什么的。
例如,在对我的数据使用 unset 函数之前,我的数据库中的数据是这样的...
[{"Name":"James Suiter","Skill":2,"Age":15,"AgeWeeks":19,"ChanceOfLeaving":8 },{"Name":"Neil Rowlett","Skill":8,"Age":15,"AgeWeeks":11,"ChanceOfLeaving":3}
当我执行 print_r.
时,它显示为 U16sArray -> Array
在数据某处使用unset并再次保存后,现在的数据是这样的。
{"0":{"Name":"James Suiter","Skill":2,"Age":15,"AgeWeeks":20,"ChanceOfLeaving":9},"1":{"Name":"Neil Rowlett","Skill":8,"Age":15,"AgeWeeks":12,"ChanceOfLeaving":4}
因此添加了“0”和“1”。现在我的代码在很多地方都是错误的,print_r 现在显示为 U16sArray -> stdClass object.
解决方案(我认为)- 在 PHP:json_encode 页面的大约 1/4 处,我认为是答案,由 'simoncpu was here' 回答。显然,'Unsetting an element will also remove the keys. json_encode() will now assume that this is an object, and will encode it as such.'
http://php.net/manual/en/function.json-encode.php
所以看起来它工作正常,取消设置将其更改为 object,然后当我下次加载它时,它不再作为数组运行。
解决方案是在编码/保存之前使用array_values到re-index数组。
这是一个奇怪的对象,不会说谎。
这些都有效吗? (假设你的 print_r 是 print_r($this);)
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]);
恐怕这只是您无能为力的事情之一。
它与 PHP 被(不是)设计用来处理这种情况的方式有关。基本上你不能访问具有数字变量名称
的对象 属性
这个类似问题的答案将更好地解释:
但是,您可以将对象转换为数组并 access/delete 其内容。如果你愿意,然后再投回一个物体。
请参阅 php 中的类型转换手册:
http://php.net/manual/en/language.types.type-juggling.php
使用json_decode时可以传入第二个参数true
$this->U16sArray = json_decode($this->U16sJSON, true);
结果将是一个您可以直接使用的数组。
标题可能有点混乱,因为我不太确定如何描述我的 'array'。这是我使用 print_r...
时的样子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
)
它有点像一个 object 和一个 object 数组。
我想删除一个元素(例如整个 [1]
),但是如果我尝试使用 unset,例如 unset($this->U16sArray[$arrayindex])
我会得到 ...
Fatal error: Cannot use object of type stdClass as array.
我仍然很困惑我的 '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();
}
它是更大 object 的一部分。
然后从 JSON 解码为
$this->U16sArray = json_decode($this->U16sJSON);
编辑 - 更新。
我正在慢慢追查问题。基本上,它一切正常,直到我使用 unset 函数,此时,某些内容被更改、保存,然后当我重新加载它时,它开始抛出错误。大概是从一种数组变成了另一种数组什么的。
例如,在对我的数据使用 unset 函数之前,我的数据库中的数据是这样的...
[{"Name":"James Suiter","Skill":2,"Age":15,"AgeWeeks":19,"ChanceOfLeaving":8 },{"Name":"Neil Rowlett","Skill":8,"Age":15,"AgeWeeks":11,"ChanceOfLeaving":3}
当我执行 print_r.
时,它显示为 U16sArray -> Array在数据某处使用unset并再次保存后,现在的数据是这样的。
{"0":{"Name":"James Suiter","Skill":2,"Age":15,"AgeWeeks":20,"ChanceOfLeaving":9},"1":{"Name":"Neil Rowlett","Skill":8,"Age":15,"AgeWeeks":12,"ChanceOfLeaving":4}
因此添加了“0”和“1”。现在我的代码在很多地方都是错误的,print_r 现在显示为 U16sArray -> stdClass object.
解决方案(我认为)- 在 PHP:json_encode 页面的大约 1/4 处,我认为是答案,由 'simoncpu was here' 回答。显然,'Unsetting an element will also remove the keys. json_encode() will now assume that this is an object, and will encode it as such.'
http://php.net/manual/en/function.json-encode.php
所以看起来它工作正常,取消设置将其更改为 object,然后当我下次加载它时,它不再作为数组运行。
解决方案是在编码/保存之前使用array_values到re-index数组。
这是一个奇怪的对象,不会说谎。
这些都有效吗? (假设你的 print_r 是 print_r($this);)
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]);
恐怕这只是您无能为力的事情之一。 它与 PHP 被(不是)设计用来处理这种情况的方式有关。基本上你不能访问具有数字变量名称
的对象 属性这个类似问题的答案将更好地解释:
但是,您可以将对象转换为数组并 access/delete 其内容。如果你愿意,然后再投回一个物体。 请参阅 php 中的类型转换手册: http://php.net/manual/en/language.types.type-juggling.php
使用json_decode时可以传入第二个参数true
$this->U16sArray = json_decode($this->U16sJSON, true);
结果将是一个您可以直接使用的数组。