PHP — цикл foreach и многомерный массив

#php #codeigniter #multidimensional-array #foreach #nested-loops

#php #codeigniter #многомерный массив #foreach #вложенные циклы

Вопрос:

Здесь много вопросов / ответов на SO о многомерных массивах и циклах foreach, но я не нашел ни одного, который применим конкретно к моему случаю. Пожалуйста, сообщите, если вы думаете иначе.

Мой массив структурирован, как показано ниже, и выводится в представление CodeIgniter:

 Array
(
    [2] => Array //this is the unique user ID
        (
            [name] => Joe Schmoe
            [cars] => Array
                (
                    [112] => Array //this is the unique car ID
                        (
                            [cars_name] => Honda
                            [cars_type] => Sedan
                            [cars_color] => White
                        )

                    [102] => Array
                        (
                            [cars_name] => Toyota
                            [cars_type] => Sedan
                            [cars_color] => Black
                        )

                    [113] => Array
                        (
                            [cars_name] => Nissan
                            [cars_type] => Coupe
                            [cars_color] => Red
                        )
                )
        )

    [5] => Array
        (
            [name] => Buck
            [cars] => Array
                (
                    [147] => Array
                        (
                            [cars_name] => Tesla
                            [cars_type] => Sedan
                            [cars_color] => Yellow
                        )
                )
        )

    [1] => Array
        (
            [name] => Mike Mechanic
            [cars] => Array
                (
                    [140] => Array
                        (
                            [cars_name] => BMW
                            [cars_type] => SUV
                            [cars_color] => Blue
                        )

                    [145] => Array
                        (
                            [cars_name] => MB
                            [cars_type] => Sedan
                            [cars_color] => Gray
                        )

                )
        )
)
  

Мне нужна помощь в построении вложенных foreach циклов, чтобы я мог иметь доступ к каждому из элементов во всем массиве.

Я пробовал эту вложенную foreach структуру, но ничего не вышло.

 foreach ($results as $data):
    if (is_array($data)):
        foreach ($data as $value):
            if (is_array($value)):
                foreach ($value as $row):
                endforeach;
            endif;
        endforeach;
    endif;
endforeach;

echo $row->cars_name //returns a non-object error
  

Кто-нибудь знает, как объединить этот вложенный цикл?

Спасибо за помощь, высоко ценится.

Комментарии:

1. Я получаю Trying to get property of non-object ошибку при попытке повторить элемент массива

2. Это потому, что это не объект, и вы действуете так, как будто это один. Смотрите правку в моем ответе.

3. Вы пытаетесь получить доступ к переменной цикла вне цикла. Поместите это эхо во внутренний самый foreach

4. вау, кто-то проголосовал против без причины или предлагая помощь? никакой любви там не потеряно…

Ответ №1:

Вы получаете доступ к $row извне цикла. Если вы хотите обработать каждую строку, вы должны поместить этот код (echo) внутрь цикла.

Альтернативой могло бы быть использование array_walk_recursive. Это вызовет функцию обратного вызова для каждого значения в многомерном массиве.

[править]

Строка, которую вы получаете, также не является объектом. Это все еще массив. Попытайтесь

 echo $row['cars_name'];
  

Комментарии:

1. спасибо за комментарий @goleztrol — я попробовал внутри цикла и все еще получаю ту же Trying to get property of non-object ошибку —

2. @torr echo $row['cars_name']; вместо echo $row->cars_name

Ответ №2:

Я думаю, это сработает для вас..

 foreach ($results as $result) {
    if(is_array($result['cars'])){
        foreach ($result['cars'] as $car) {
            echo $car['cars_name'];
        }
    }
}
  

Также вы пытались получить доступ к элементу массива с помощью обозначения доступа к атрибуту класса.