Я не совсем уверен, что вы пытаетесь сделать, но вы переназначаете
$key = array() ;
сразу после вашего
foreach ($amount as $key)
Это вызывает ваши
<td><?php echo $key;?></td>
чтобы попытаться отобразить массив, потому что вы перезаписали значение $ key, присвоенное foreach.
В вашем посте не указано, какие данные дублируются, поэтому я не могу ответить на этот вопрос в этом ответе.
Вы дублируете те же три строки, потому что вы устанавливаете
$new = array_combine($item, $amount);
Затем ваш SQL захватывает строки
$stmt = $dbh->query('SELECT *
FROM `products`
WHERE `id` IN (' . $each . ')');
Затем вы зацикливаетесьнад теми же элементами с
foreach ($new as $key => $val) {
Если вы хотите отобразить элементы, которые вы нашли в SQL, тогда у вас не должно быть
foreach ($new as $key => $val) {
внутри цикла while ().Ваш while () уже перебирает строки, возвращенные для этих элементов.Это предполагает, что у вас есть только один продукт на номер изделия.
Если вы ожидаете, что для каждого номера элемента будет возвращаться один или более 'products', то вы должны выполнять SQL во время циклического прохождения через foreach ($ new), но это не появляетсябыть тем, что делает верхняя часть вашего кода.
После некоторой перемотки мы выявили проблему: суммы должны быть привязаны к номерам элементов.
Вы получаете номера элементов и количества в виде массивов из своего HTML.Таким образом, вам нужно пройтись по пунктам и связать их с вашими количествами.
// where your qualities will live
$quantities = array() ;
// loop through the array of items you received and match them up with their quantity
foreach($item as $k=>$id) {
$quantities[$id] = $amount[$k] ;
}
Затем вы можете получить доступ к количеству в цикле while, используя:
$row['quantity'] = $quantities[$row['id']] ;