Как мне лучше всего обрабатывать мои многомерные массивы в PHP? - PullRequest
0 голосов
/ 05 марта 2009

У меня есть приложение, которое показывает продажи в магазине. Это многомерный массив, поэтому каждое значение в корневом массиве представляет собой массив, содержащий [sales], [cost], [date] и т. Д. Для данного дня, к которому он относится. ОК, для каждого магазина есть 2 массива. Один для проверенных номеров, а следующий для непроверенных номеров. Неподтвержденные получают сразу после проверки, поэтому первая дата в непроверенной будет через один день после проверки.

ОК, пока все в порядке.

Но когда я показываю общие продажи по всем магазинам, мне нужно объединить все проверенные и все непроверенные цифры, чтобы получить общее количество. Вот сложная часть. Проверенный массив должен соответствовать только дате наименьшего подтвержденного хранилища, а все остальные должны быть непроверенными. Например: если на определенную дату все магазины имеют проверенные номера, но одно из них не подтверждено на эту дату, то все они должны быть проверены на эту дату. Таким образом, создается впечатление, что необходимо создать проверенную итоговую сумму и непроверенную итоговую сумму, проверить каждый массив и, если они все проверены, добавить в проверенный массив, иначе, если таковые имеются, добавить непроверенный массив.

Я надеюсь, что с тех пор, я изо всех сил стараюсь объяснить ситуацию. У меня есть алгоритм, который работает, но он настолько сложен, что я должен изучать его вечно каждый раз, когда работаю над ним, и я надеялся, что найдется более элегантное решение.

Спасибо !!!

Вот как выглядит структура массива

$verified ( 
    [0](sales => 355, cost=> 233, date=> 2008-03-01)
    [0](sales => 235, cost=> 133, date=> 2008-03-02)
    [0](sales => 435, cost=> 143, date=> 2008-03-02)
)
$unverified ( 
        [0](sales => 232, cost=> 133, date=> 2008-03-03)
        [0](sales => 335, cost=> 233, date=> 2008-03-04)
        [0](sales => 535, cost=> 243, date=> 2008-03-05)
    )

Это фиктивные данные, но в действительности будет больше записей. Есть эти 2 массива для каждого магазина. Дата не будет отображаться для обоих массивов; дата будет только в непроверенной или проверенной.

Но если у вас есть несколько наборов этих массивов для каждого магазина и вам нужно объединить их, непроверенные номера разных магазинов начнутся в разные даты. storeA может быть проверено до 15-го, а storeB может быть проверено до 7-го. Поэтому мне нужно построить новый $verified и новый $unverified из всех единиц для каждого магазина. Но я не могу просто объединить все проверенные, потому что они охватывают разные диапазоны дат. Поэтому, если все даты проверены, они остаются проверенными в новом главном массиве, но если они не проверены, им нужно перейти к новому главному непроверенному массиву.

Если этого не произойдет, так как мне жаль.

Ответы [ 3 ]

2 голосов
/ 05 марта 2009

Гораздо чаще стратегический прорыв придет от переделки представление данных или столы. Это где сердце Программа лжи. Покажите мне свои блок-схемы и скрою твои столы, а я буду продолжать быть мистифицированным. Покажи мне твой столы, и мне обычно не понадобятся ваши блок-схема; они будут очевидны.

- Фредерик П. Брукс-младший, Мифический человеко-месяц

Я предполагаю, что вы хотите создать массивы $total_verified и $total_unverified для всех магазинов.

  1. Построить $total_unverified из $unverified массивов для всех магазинов, отслеживающих самую раннюю дату в $earliest_unverified_date.

  2. Добавить значение из каждого массива $verified для всех хранилищ к $total_verified, если запись имеет дату, и она более ранняя, чем $earliest_unverified_date, иначе добавить значение к массиву $total_unverified.

1 голос
/ 05 марта 2009

Я предполагаю, что вы извлекаете все эти числа из базы данных. (И если нет, то почему?), и что ваша база данных выглядит примерно так:

TABLE SalesSummary

Id   StoreId  Date        SalesTotal  CostTotal  Verified
...
231  1        2008-03-01  355.00      233.00     true
232  2        2008-03-01  299.00      233.00     true
233  1        2008-03-02  235.00      133.00     false
234  2        2008-03-02  335.00      133.00     true
235  1        2008-03-03  435.00      143.00     false
236  2        2008-03-03  319.00      143.00     false

тогда

SELECT MIN(Date) AS FirstUnverifiedDate FROM SalesSummary WHERE Verified=false

находит первую непроверенную дату, а

SELECT
  (Date < $FirstUnverifiedDate) AS Verified,
  StoreId,
  SUM(SalesTotal) AS SalesSum,
  SUM(CostTotal) AS CostSum
FROM
  SalesSummary
WHERE
  Date >= $BeginningOfMonth
GROUP BY
  (Date < $FirstUnverifiedDate) DESC,
  StoreId ASC

возвращает вам требуемые итоги продаж - без необходимости каждый раз извлекать полный набор данных из базы данных!

1 голос
/ 05 марта 2009

Ваша проблема звучит так, как будто для этого созданы реляционные базы данных. Вы используете базу данных? Если это так, правильный запрос (или два запроса) с использованием GROUP BY или ROLLUP может сэкономить вам несколько миллиардов строк PHP.

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