Итерация по массиву объектов - PullRequest
0 голосов
/ 25 сентября 2011

Я создал массив объектов со следующим кодом:

$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");
    }

ошибка, которую яget is this:

Исправляемая фатальная ошибка: объект класса stdClass не может быть преобразован в строку

Я предполагаю, что это потому, что я пытаюсь отобразить массив вместо фактического имени "account",Есть ли способ получить это имя учетной записи или его суб (то есть 55) и установить его в переменную?Мне понадобится та же самая переменная для итерации и выполнения вычислений для данных в массиве под ней, так что это поможет в два раза.

Спасибо,

Серебряный тигр


ОБНОВЛЕНИЕ: ***************************


Вот мой объект:

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-> accounts- $ variable-> week-> sales.

Я также посмотрю на преобразование объекта в массив для работы с ним, я просто искал лучшее решение.


ОБНОВЛЕНИЕ:

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

Эффективно, цикл выше дает мне все «счета», которые нужны.Я мог бы засунуть их в массив, чтобы использовать для итерации по моим объектам и завершить необходимые мне вычисления, хотя это ужасно неэффективный способ получить список. Я не нашел способа ссылаться на имя объекта, кроме как непосредственно ссылаться на него ик сожалению, мой список создается динамически ... заранее сказать невозможно.

Кто-нибудь знает лучший способ получить список идентификаторов учетных записей на 2-м уровне объекта?

Спасибо,

Серебряный тигр


ОБНОВЛЕНИЕ:

В итоге я просто запросил свою базу данных, чтобы узнать, какие учетные записи были активны как на стороне «продажи», так и на «подлежащей оплате»сторона и вернул тот же список учетных записей (45, 54, 55, 56), который присутствовал при создании объекта на первом месте.Сейчас я использую этот результат для обработки данных по мере необходимости.

Спасибо.

Ответы [ 2 ]

1 голос
/ 25 сентября 2011

Ваша переменная $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-многомерный массив к StdClass-объекту /

0 голосов
/ 25 сентября 2011

У вас есть составной объект, поэтому вам нужно пройтись по каждому уровню вашей композиции, чтобы отобразить строки внутри композита (если это то, чего вы пытаетесь достичь, было не совсем понятно,мне, к чему стремится ваш вопрос):

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_vars Документы :

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

Надеюсь, это поможет вам продолжить дальше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...