PHP-从stdclass对象的stdclass数组中删除元素

PHP-从stdclass对象的stdclass数组中删除元素,php,arrays,unset,Php,Arrays,Unset,标题可能有点混乱,因为我不太确定如何描述我的“数组”。下面是我使用print\r时的外观 stdClass Object ( [0] => stdClass Object ( [Name] => Claude Bemrose [Skill] => 7 [Age] => 14 [AgeWeeks] => 11 [ChanceOfLeaving] => 12 ) [1

标题可能有点混乱,因为我不太确定如何描述我的“数组”。下面是我使用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
    )
它看起来有点像一个包含一系列对象的对象

我想删除一个元素(例如整个
[1]
),但是如果我尝试使用unset,例如
unset($this->U16sArray[$arrayindex])
我会得到

致命错误:无法将stdClass类型的对象用作数组

我仍然很困惑我的“数组”最初是如何或为什么以这种方式出现的。但我很高兴以这种方式使用它,只要我可以删除on元素

根据要求提供更多的信息。它是使用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();    
    }
它是一个更大物体的一部分

然后用

$this->U16sArray = json_decode($this->U16sJSON);
编辑-更新

我正在慢慢地追查这个问题。基本上,它工作正常,直到我使用unset函数,在这一点上,一些东西被修改、保存,然后当我重新加载它时,它开始抛出错误。大概是从一种类型的数组改成了另一种类型的数组

例如,在对数据使用unset函数之前,数据库中的数据如下所示

[{“姓名”:“詹姆斯·西特”,“技能”:2,“年龄”:15,“年龄周”:19,“机会跳槽”:8},{“姓名”:“尼尔·罗利特”,“技能”:8,“年龄”:15,“年龄周”:11,“机会跳槽”:3}

当我打印时,它显示为U16sArray->Array

在数据中的某个地方使用了unset并再次保存之后,数据现在看起来是这样的

{“0”:{“姓名”:“詹姆斯·西特”,“技能”:2,“年龄”:15,“年龄周”:20,“机会周”:9},“1”:{“姓名”:“尼尔·罗利特”,“技能”:8,“年龄”:15,“年龄周”:12,“机会周”:4}

因此,添加了“0”和“1”。现在,我的代码在不同的地方都是错误的,并且打印出来的结果显示为U16sArray->stdClass对象

解决方案(我认为)-在PHP:json_encode页面的1/4处,我认为是答案,答案是“simoncpu在这里”。显然,“取消设置元素也会删除键。json_encode()现在将假定这是一个对象,并将对其进行编码。”

所以它看起来工作正常,unset将它更改为一个对象,然后当我下次加载它时,它不再作为数组使用


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

这是一个奇怪的对象,不会说谎

做这两项工作吗?(假设您的打印是打印($this);)

更多信息:

编辑:不过,我建议更改通过PDO获取此信息的方式,使其采用数组格式。有关如何执行此操作的详细信息,请参见:

一旦将其设置为数组格式,就可以简单地使用:

unset($data[1]);

恐怕这只是你不能做的事情之一。 这与PHP处理此类情况的设计方式有关。基本上,您不能使用数字变量名访问对象属性

对类似问题的回答将更好地解释:

但是,您可以将对象强制转换为数组并访问/删除其内容。然后,如果您愿意,可以将其强制转换回对象。 请参阅php中类型转换的手册:

使用json_decode时,可以传入第二个参数true

$this->U16sArray=json_decode($this->U16sJSON,true)


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

是否使用了
unset
?请尝试
unset($this->{'1'})
没有数组,只有对象的数字属性。为什么要对数组使用
stdClass
,而不是只使用普通数组?@Barmar我不知道这家伙为什么要这样做,但当通过ORM或框架从数据库中提取结果,而不是指定数组作为结果时,经常会发生这种情况键入。许多人假设对象。你能告诉我们你是如何创建这个对象的吗?是的,这个对象首先是奇怪的。我也许应该尝试修复它,使它更…合理。我甚至不知道它是如何得到的…解决方案不起作用,但它们不会导致错误。它们似乎对对象/数组没有任何作用。你是怎么做到的你得到了这些数据吗?它是使用PDO或其他框架从数据库中提取的吗?我可以帮助将其放入包含对象的数组中。无论哪种方式,这是否有效?$this wil word仅在类中使用我认为对象的形成是个问题。它被创建为对象,通过$object->array[]添加到数组中=$newobject。问题可能是它正在通过一个使用PDO和JSON的数据库。因此它被编码为JSON,保存到数据库中,加载并解码。然后是这种形式。但是不,unset选项不起作用,尽管它们没有给出错误。你能用用于使用PDO从数据库中提取数据的代码更新你的问题吗?PDO h作为将数据自动作为对象或数组拉入的选项。切换到数组将解决此问题。谢谢,看起来我需要强制转换/删除/重铸,或者首先修复我形成对象/数组的方式。至少这为我指明了方向,因此,谢谢:)我相信直接将json解码为asso会简单得多ciative array并在数据处理后强制转换为对象
$this->U16sArray=json_decode($this->U16sJSON,true);
是的,这已经修复了它,因此它现在是一个数组。这在某种程度上解决了问题,尽管我现在遇到了一些其他问题…但它们都是可以解决的:)
unset($data[1]);