Получение количества экземпляров в массиве (вычитание после продолжения; оператор в цикле) - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть «Таблица истории цен», основанная на таблице MySQL. Поскольку у нас много одинаковых списков, многие из этих записей отображаются как дубликаты, помимо, конечно, ItemID.

Вот как я в настоящее время отсеиваю дубликаты (на самом деле не дубликаты, а похожие списки, которые имеютте же SKU, Ymd Date, Previous Price, New Price и каналы продаж. - а также пытается получить количество (см. логику $ count ниже) количества найденных одинаковых / «повторяющихся» строк)

$inventoryhistoryrows = array();

$skuarray = array();

foreach ($pricehistoryarray as $ph_key => $ph_values) {

// defining variables, etc.
. . . . . 

$ph_sku_timestamp = $inventoryskus . ' ' . $ph_timestamp . ' ' . $ph_previousprice . ' ' . $ph_newprice . ' ' . $ph_channel;

if (in_array($ph_sku_timestamp, $skuarray)) { continue; }

$skuarray[] = $ph_sku_timestamp;

if(isset($prev)) {
    $newcount = $count - $prev;
    $prev = $count;
}
else {
    $prev = $count;
    $newcount = $count;
}

$ inventoryhistoryrows [] = массив ($ newcount, $ ph_itemid, $ventoryskus, $ ph_previousprice, $ ph_newprice, $ ph_channel, $ ph_timestamp);

Это работает .... но мой $newcountвсегда на одну строку впереди!

Вот иллюстрация вывода в таблице:

enter image description here

Обратите внимание на стрелки на крайней левой стороне. Переменные $ newcount верны, но весь первый столбец необходимо переместить на одну строку вверх.

Значение, 1 должно быть удалено из первой строки. 3 Должен быть в первом ряду. 17 Должен быть во втором ряду.

Я, конечно, вижу, что причина, по которой 1 появляется в первом ряду, связана с этим утверждением

else {
    $newcount = $count;
}

То есть это будетвсегда возвращайте 1 для первой строки, так как prev не существует. Но я просто положил это туда, так как не знал, как правильно получить данные, как я хотел.

У кого-нибудь есть идеи, как мне это сделать? В начальном цикле foreach для $pricehistoryarray (я полагаю, это будет лучшим решением) или относительно простым способом смещения вверх только первого столбца после построения массива $inventoryhistoryrows?

1 Ответ

0 голосов
/ 07 ноября 2019

Видимо, это может быть лучше в MySQL Query (см. Комментарии)

Это, кажется, работает

SELECT COUNT(*) as count
     , itemid
     , previousprice
     , newprice
     , channel
     , timestamp 
  FROM listing_price_history 
 WHERE listing_price_history.timestamp > DATE_SUB(now(), INTERVAL 30 DAY)     
 GROUP 
    BY previousprice
     , newprice
     , channel
     , DATE(timestamp) 
 ORDER 
    BY listing_price_history.timestamp DESC

Большое спасибо @Cid за руководство

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...