#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 ?? Как??