PHP array_sum выводит отдельные числа, а не как целое

#php #html #mysql #pdo

#php #HTML #mysql #pdo

Вопрос:

У меня есть этот список «купонов», каждый из которых имеет уникальный «productid»

купоны

Теперь я пытаюсь преобразовать список в массив, используя:

 $claimed = array($rowOrder['productid']);
  

Моя проблема в том, что когда я пытаюсь использовать «count» и «array_sum», он выводит отдельные числа:

 $count_claimed = array(count($claimed));
echo array_sum($count_claimed);
  

Используя echo, которое я получаю, и вывод: «1111111»
Что я должен изменить, чтобы получить общее количество 7? (как показано с количеством «купонов»)

дополнительная информация:

«Купоны» выводятся этим SELECT оператором, $rowOrder вызывающим это.

 public function SelectLst_ByUsrCustomerIDInfo($db, $usrcustomerid) {
    $stmt = $db->prepare(
      " SELECT o.orderid, o.productid, o.usrcustomerid, o.amount, o.amountrefunded, o.createddate, o.scheduleddate, o.useddate, o.expirationdate, p.photosrc
        FROM `order` o LEFT JOIN `product` p ON o.productid = p.productid

        WHERE usrcustomerid = :usrcustomerid"
    );

    $stmt->bindValue(':usrcustomerid', $usrcustomerid, PDO::PARAM_INT);
    $stmt->execute();
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    return $rows;
}
  

Это называется следующим образом

 $lstInfo = $mcOrder->SelectLst_ByUsrCustomerIDInfo($db, $usrcustomerid);
foreach($lstInfo as $rowOrder) {
    if (isset($rowOrder['productid']) amp;amp; ($rowOrder['expirationdate'] >  date("Y-m-d H:i:s"))) {
        $claimed = array($rowOrder['productid']);
        $count_claimed = array(count($claimed));
        echo array_sum($count_claimed);
    }
}
  

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

1. $claimed = array($rowOrder['productid']); также будет массив длиной один . Вероятно, вы захотите поместить его в массив вместо того, чтобы присваивать его массиву, а затем использовать count() отдельно ( array_sum() будет суммироваться все значения массива, состоящего из многих чисел).

2. Вы должны показать еще немного кода — вы извлекаете эти данные из запроса? Если да, можете ли вы поделиться этим кодом?

3. обновил мой вопрос дополнительной информацией

4. И как вы вызываете SelectLst_ByUsrCustomerIDInfo ? Также покажите этот код.

5. снова обновленный вопрос

Ответ №1:

Выполнив это, count($lstInfo) вы получите общее количество выбранных строк ( PDOStatement::fetchAll() возвращает массив, и вы просто подсчитываете количество элементов в нем). Затем вы можете обрабатывать результаты в цикле и увеличивать вызываемую переменную $claimed , если условие истинно.

 $lstInfo = $mcOrder->SelectLst_ByUsrCustomerIDInfo($db, $usrcustomerid);
$total = count($lstInfo);
$claimed = 0;
foreach($lstInfo as $rowOrder) {
    if (isset($rowOrder['productid']) amp;amp; ($rowOrder['expirationdate'] >  date("Y-m-d H:i:s"))) {
         $claimed  = 1;
    }
}
echo "Claimed $claimed of $total.";
  

Еще лучше, вы можете сделать это в одном запросе, используя COUNT() и добавленное WHERE условие. Это означает, что вы не получите итоговое значение, но, похоже, это тоже не было вопросом с самого начала.

 $stmt = $db->prepare("SELECT COUNT(productid) as cnt
                      FROM `order` o 
                      LEFT JOIN `product` p 
                           ON o.productid = p.productid
                      WHERE usrcustomerid = :usrcustomerid
                       AND expirationdate > NOW()
                      GROUP BY usrcustomerid");
$stmt->execute([":usrcustomerid" => $usrcustomerid]);
$result = $stmt->fetch();
echo "Claimed ".$result['cnt'];
  

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

1. я вижу, мне нужно посчитать внутри цикла for, спасибо за помощь.

Ответ №2:

Попробуйте это,

 $claimed = array();
foreach($products as $rowOrder){
    array_push($claimed,$rowOrder['productid']);
}
echo count($claimed);
echo array_sum($claimed);die;