цикл foreach внутри многомерного массива

#php #arrays

#php #массивы

Вопрос:

У меня есть массив $new_items со следующим выводом в print_r:

     Array
    (
        [0] => Array
            (
                [id] => 70494
                [weight] => 0.3000
                [Price] => 31.4400
                [url] => http://www.myshop.com
                [name] => Apple iphone
                [category] => Array
                    (
                        [parent_id] => Array
                            (
                                [0] => 53
                                [1] => 81
                            )

                        [parent_name] => Array
                            (
                                [0] => Mobile
                                [1] => Bluetooth  Devices
                            )

                        **[category_id] => Array
                            (
                                [0] => 150
                                [1] => 1384
                            )**

                        [category_name] => Array
                            (
                                [0] => iphone 4s
                                [1] => Bluetooth Speaker
                            )

                    )

                **[media] => Array
                    (
                        [images] => Array
                            (
                                [0] => http://www.myshop.com/file_2111_316.jpg
                                [1] => http://www.myshop.com/file_2112_260.jpg**

                            )

                    )
 

Как я могу написать цикл foreach внутри другого цикла foreach, чтобы я мог получить все значения, включая значения [category_id] и [media] [images] .

Это делается для вставки значений в 2 отдельные таблицы.

Мой текущий код:

 foreach($new_items as $key => $value) {
    $stmt = $conn->prepare("INSERT INTO   products(id,weight,price,cb_url,product_name) 
                            VALUES(:id,:weight,:price,:url,:name)");
    $stmt->execute(array(':id' => $value['id'], ':weight' => $value['weight'], ':price' => $value['Price'], ':url' => $value['url'],
                  ':name' => $value['name']));

    //second table insert
    $PID = $conn->lastInsertId();
    $stmt = $conn->prepare("INSERT INTO temp_products(productid,catid) 
                            VALUES(:pid,:catid)");
    $stmt->execute(array(':pid' => $PID, ':catid' => $value['category']['category_id']));
}
 

Все идет нормально, за исключением того, что столбец catid в таблице 2 получает вставленное в него значение «array», в котором есть несколько элементов в элементе массива [category_id] выше. Если присутствует только 1 элемент, он вставляется правильно. Мне нужно вставить [media] [images] аналогично.

Нужно ли нам писать цикл foreach внутри существующего цикла foreach? Или еще как поступить? Запрошена помощь…

Ответ №1:

Поскольку category_id это массив, вам нужен другой foreach цикл:

 //second table insert
$PID = $conn->lastInsertId();
$stmt2 = $conn->prepare("INSERT INTO temp_products(productid, catid) VALUES(:pid, :catid)");
if (!is_array($value['category']['category_id'])) {
    $value['category']['category_id'] = array($value['category']['category_id']);
}
foreach ($value['category']['category_id'] as $catid) {
    $stmt2->execute(array(':pid' => $PID, ':catid' => $catid));
};
 

Обратите внимание, кстати, что вам нужно подготовить инструкцию только один раз, вне цикла. Вы должны сделать то же самое с первым INSERT оператором.

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

1. Спасибо. Но теперь вставляются только идентификаторы категорий с несколькими элементами, но не с одним элементом.

2. Кто тот идиот, который разработал эту структуру данных так, чтобы она не была однородной? Если есть один элемент, он должен поместить его в массив с одним элементом, а не в виде строки.

3. @ Barmar Вы абсолютно правы. Это XML-канал, поступающий от другой компании.

4. Конечно, вы можете. В этом нет ничего особенного category_id .

5. Последний вопрос, пожалуйста. Вставка изображений работает нормально, за исключением $PID = $conn-> lastInsertId(); вставляется как 2 для первого элемента. Должны ли мы сбросить последний insertid после первого foreach ?? Как??