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);

结果将是一个您可以直接使用的数组。