проблема цикла foreach - PullRequest
0 голосов
/ 05 мая 2011

Foreach не работает должным образом, потому что в массиве есть несколько массивов, а также объектов.

Например:

Array
(
    [0] => modelItem Object
        (
            [name] => Name 1
            [option] => Array
                (
                    [0] => modelOption Object
                        (
                            [id] => 28383
                            [price] => 1.70
                        )
                )

            [quantity] => 2
        )

    [1] => modelItem Object
        (
            [name] => Name 2
            [option] => Array
                (
                    [0] => modelOption Object
                        (
                            [id] => 28398
                            [price] => 3.50
                        )
                )

            [quantity] => 2
        )

    [subtotal] => 10.40
    [deliveryArea] => modelDeliveryArea Object
        (
            [postcode] => BL2
        )

    [delivery] => 1
)

Я хочу цикл foreach only для объекта ModelItem и modelItemТолько объект, как это можно сделать?

Я пытался сделать это:

    <?php 
    foreach ($items as $key => $item) {
     echo  $item->name;
    foreach ($item->option as $o) {
    echo $o->price;
      }
      }
    ?>

Это работает нормально, но я также получаю сообщение об ошибке:

Warning: Invalid argument supplied for foreach()

Этоэто из-за subtotal, deliveryArea Я думаю.

Редактировать: Извините, исправил код цикла - забыл добавить {}

Ответы [ 3 ]

2 голосов
/ 05 мая 2011

Попробуйте:

<?php 
foreach ($items as $key => $item) {
    if ($item instanceof modelItem) {
        echo  $item->name;

        if (isset($item->option) && is_array($item->option)) {
            foreach ($item->option as $o) {
                echo $o->price;
            }
        }
    }
}
2 голосов
/ 05 мая 2011

Хорошо, причина того, что ваш код не работает, в том, что вы смешиваете типы ваших массивов. Это означает, что у вас будут проблемы, если вы всегда ожидаете, что $item будет классом. ЕСЛИ вы можете, я рекомендую реструктурировать ваш массив так, чтобы ваши modelItem объекты были в массиве сами по себе, чтобы облегчить жизнь.

Если вы не можете ... Попробуйте это:

<?php 
if (is_array($items)) {
    foreach ($items as $key => $item) {

        if(is_a($item, 'modelItem')) {            
            echo  $item->name;

            foreach ($item->option as $o) {
                echo $o->price;
            }
        }
    }
}

В качестве примечания is_a() устарела в php 5.0 - 5.2 и теперь не поддерживается в php 5.3. Если вы используете php 5.0 - 5.2, см. Пример yoshi.

0 голосов
/ 05 мая 2011

В массиве, подобном этому, я бы рекомендовал проверить это так:

if(isset($someVar))
{

}

или в вашем случае проверьте, является ли is_array следующим образом:

если (is_array ($ что-то)) {

}

Вы не можете зациклить строку в вашем случае subtotal, deliveryArea

Надеюсь, это поможет!

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