迭代通过Object数组

时间:2011-09-25 08:41:25

标签: php arrays object

我使用以下代码创建了一个对象数组:

$data = (object)array();

并用数据填充它。当我完成时,它的结果看起来应该是这样的:

Data->  accounts->  54->    today-> sales
                    checkout_fees
                    trans_fees
                    payable
                week->  sales
                    checkout_fees
                    trans_fees
                    payable
                month-> sales
                    checkout_fees
                    trans_fees
                    payable
                year->  sales
                    checkout_fees
                    trans_fees
                    payable
            55->    today-> sales
                    checkout_fees
                    trans_fees
                    payable
                week->  sales
                    checkout_fees
                    trans_fees
                    payable
                month-> sales
                    checkout_fees
                    trans_fees
                    payable
                year->  sales
                    checkout_fees
                    trans_fees
                    payable

当我尝试对树中的元素执行foreach时,它失败了:

    foreach ($data->accounts as $account) {
        echo ("Working to calculate account for account ".$account."<br>\n");
    }

我得到的错误是:

捕获致命错误:类stdClass的对象无法转换为字符串

我认为这是因为我试图回显数组而不是实际的“帐户”名称。有没有办法获取此帐户名称或它的子(即55)并将其设置为变量?我将需要相同的变量来迭代并对其下的数组中的数据执行计算,这将有助于双重。

谢谢,

Silver Tiger


更新: * ** * ** * ** * ** * ** * ** * ** * ** * **


这是我的目标:

object(stdClass)#11 (4) { 
    ["56"]=> object(stdClass)#12 (3) { 
        ["week"]=> object(stdClass)#13 (4) { 
            ["sales"]=> float(6) 
            ["checkout_fees"]=> float(0) 
            ["trans_fees"]=> float(0.67) } 
        ["month"]=> object(stdClass)#21 (4) { 
            ["sales"]=> float(6) 
            ["checkout_fees"]=> float(0) 
            ["trans_fees"]=> float(0.67) } 
        ["year"]=> object(stdClass)#27 (4) { 
            ["sales"]=> float(6) 
            ["checkout_fees"]=> float(0) 
            ["trans_fees"]=> float(0.67) } } 
    ["55"]=> object(stdClass)#15 (3) { 
        ["week"]=> object(stdClass)#16 (4) { 
            ["sales"]=> float(24) 
            ["checkout_fees"]=> float(0) 
            ["trans_fees"]=> float(0.67) } 
        ["month"]=> object(stdClass)#23 (5) { 
            ["sales"]=> float(24) 
            ["checkout_fees"]=> float(0) 
            ["trans_fees"]=> float(0.67) 
            ["payable"]=> string(5) "14.00" } 
        ["year"]=> object(stdClass)#29 (5) { 
            ["sales"]=> float(24) 
            ["checkout_fees"]=> float(0) 
            ["trans_fees"]=> float(2.68) 
            ["payable"]=> string(5) "14.00" } } 
    ["54"]=> object(stdClass)#18 (3) { 
        ["week"]=> object(stdClass)#19 (4) { 
            ["sales"]=> float(4) 
            ["checkout_fees"]=> float(0) 
            ["trans_fees"]=> float(0.67) } 
        ["month"]=> object(stdClass)#25 (4) { 
            ["sales"]=> float(4) 
            ["checkout_fees"]=> float(0) 
            ["trans_fees"]=> float(0.67) } 
        ["year"]=> object(stdClass)#31 (4) { 
            ["sales"]=> float(4) 
            ["checkout_fees"]=> float(0) 
            ["trans_fees"]=> float(0.67) } } 
    ["45"]=> object(stdClass)#33 (3) { 
        ["week"]=> object(stdClass)#34 (1) { 
            ["payable"]=> string(5) "15.00" } 
        ["month"]=> object(stdClass)#35 (1) { 
            ["payable"]=> string(5) "15.00" } 
        ["year"]=> object(stdClass)#36 (1) { 
            ["payable"]=> string(5) "15.00" 
            } 
        } 
    }
 } 

我知道它有一个层次,因为它应该像一个多维数组,但每个项目都是一个对象。我需要能够获取对象的名称,并使用$ data-&gt; accounts- $ variable-&gt; week-&gt; sales来使用该名称和参考数据。

我还将研究将对象转换为数组以使用它,我只是在寻找最佳解决方案。


UPDATE:

for ($counter=1; $counter < 9999; $counter++) {
    if (isset($data->{$counter})) {
        echo "Account number ".$counter." has data.<br>\n";
    }
}

有效地,上面的循环为我提供了所有需要的“帐户”。我可以将这些推入一个数组,用于迭代我的对象并完成我需要的计算,虽然这是一种非常低效的方法来获取列表我发现没有办法引用一个对象的名称,除了直接引用它和不幸的是我的列表是动态创建的..没有办法提前告诉。

有没有人知道更好的方法来获取对象第二级的帐户ID列表?

谢谢,

Silver Tiger


UPDATE:

我最后只是查询我的数据库以查看哪些帐户在“销售”方面和“应付”方面都处于活动状态,并返回创建时存在的相同帐户列表(45,54,55,56)他首先出现的对象。我现在正在使用此结果来根据需要处理数据。

谢谢你。

2 个答案:

答案 0 :(得分:1)

您的$account变量本身就是一个对象,例如:

54->        today-> sales
                checkout_fees
                trans_fees
                payable
            week->  sales
                checkout_fees
                trans_fees
                payable
            month-> sales
                checkout_fees
                trans_fees
                payable
            year->  sales
                checkout_fees
                trans_fees
                payable

这不能转换为字符串。

请改用:

foreach ($data->accounts as $account) {
    echo ("Working to calculate account for account:");
    var_dump($account);
}

您可能也有兴趣将stdClass对象转换为数组。我推荐你这个:

http://www.if-not-true-then-false.com/2009/php-tip-convert-stdclass-object-to-multidimensional-array-and-convert-multidimensional-array-to-stdclass-object/

答案 1 :(得分:-1)

你有一个组合对象,所以你需要遍历你的合成的每个级别来显示复合内的里面的字符串(如果这是你试图实现的,那就不完全清楚了)对我来说你的目标是什么):

Data ->
  accounts ->
    account (numbered) ->
      period ->
        fees

在PHP中:

foreach($data->accounts as $account)
   foreach($account as $period)
       foreach($period as $fee)
           echo $fee, "\n";

如果我正确阅读您的评论,您需要访问编号属性,您可以将它们放在大括号中:

$data->accounts->{54}->week->sales - $data->accounts->{55}->week->transaction_fees

正如您在评论中写道,您在找到所有帐号数量方面遇到了问题,这些帐户只是$data->accounts的对象变量。您可以使用get_object_varsDocs函数获取此类列表:

$numbers = get_object_vars($data->accounts);

我希望这有助于您继续深造。