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

时间:2015-11-03 18:23:14

标签: php arrays unset

标题可能有点令人困惑,因为我不太清楚如何描述我的数组'。这是我使用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类型的对象作为数组。

我仍然非常困惑我的阵列'首先出现这种方式。但是我很高兴以这种方式使用它,只要我能删除元素。

根据要求提供更多信息。它是使用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);

编辑 - 更新。

我慢慢追查问题。基本上,它一切正常,直到我使用unset函数,此时,某些内容被更改,保存,然后当我重新加载它时,它开始抛出错误。据推测,它已经从一种阵列变为另一种阵列。

例如,在对我的数据使用unset函数之前,我数据库中的数据看起来像这样......

[{" Name":" James Suiter"," Skill":2," Age":15," AgeWeeks":19," ChanceOfLeaving":8},{" Name":" Neil Rowlett"," Skill":8, "年龄":15," AgeWeeks":11," ChanceOfLeaving":3}

它显示为U16sArray - >我执行print_r时的数组。

在数据中某处使用unset并再次保存后,数据现在看起来像这样。

{" 0":{"姓名":" James Suiter","技能":2,"年龄&# 34;:15," AgeWeeks":20," ChanceOfLeaving":9}," 1" {"名称":&#34 ; 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重新索引数组。

3 个答案:

答案 0 :(得分:1)

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

这些都可以吗? (假设你的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]);

答案 1 :(得分:0)

我担心这只是你做不了多少事情之一。 它与PHP(非)设计用于处理此类情况的方式有关。基本上,您无法使用数字变量名称

访问对象属性

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

但是,您可以将对象强制转换为数组并访问/删除其内容。如果你愿意的话,然后再投回一个物体。 请参阅php中关于类型转换的手册: http://php.net/manual/en/language.types.type-juggling.php

答案 2 :(得分:0)

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

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

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