PHP nasıl iyi süreç benim çok boyutlu diziler do?

3 Cevap php

Ben mağaza satışlarını gösteren bir uygulama var. Bu çok boyutlu bir dizidir, bu nedenle kök dizideki her değeri bir gün için [sales], [cost], [date], vb içeren bir dizidir o ile ilgilidir. Tamam, her bir mağaza için 2 diziler vardır. Doğrulanmış bir sayı için olan ve bir sonraki onaylanmamış numaraları içindir. Hemen sonra onaylanmamış alır kadar doğrulanmadı, yani onaylanmamış ilk tarih doğrulandıktan sonra bir gün olacak.

Tamam, bütün bu şimdiye kadar gayet iyi.

Ben tüm mağazalar için toplam satışları göstermek Ama, ben birleştirmek için gereken tüm doğrulanmış ve toplam almak için tüm onaylanmamış sayılar. Burada zor kısmı. Doğrulanmış dizisi yalnızca en düşük doğrulanmış mağazanın güncel gitmeli ve geri kalan her doğrulanmamış edilmelidir. Örneğin: tüm mağazalar numaraları doğruladıktan ama bir o tarih için doğrulanmamış ise, belirli bir tarihte, sonra hepsi o tarih için doğrulanmamış gerekir. Yani bir doğrulanmış toplam oluşturmak gerekiyor gibi, ve doğrulanmamış bir toplam, her bir dizi kontrol ve hepsi doğrulanmış eğer varsa onaylanmamış onaylanmamış diziye eklemek vardır başka, doğrulanmış diziye ekleyin.

Ben durumu açıklamak için elimden geleni yapıyorum, çünkü bu yapar umuyoruz. Ben çalışan bir algoritma var ama ben sonsuza dek Ben bunun üzerinde çalışmak her zaman onu incelemek zorunda ve ben bir daha zarif bir çözüm olduğunu umuyordum kadar karmaşık.

Teşekkürler!

İşte dizi yapısı gibi görünüyor ne

$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)
    )

Bu kukla veri, ancak gerçekte daha girdi olacaktır. Her mağaza için bu 2 dizi vardır. Tarihi hem diziler için görünmeyecektir; Bir tarih sadece onaylanmamış veya doğrulanmış olacaktır.

Her mağaza için bu diziler birkaç takım var ve bunları birleştirmek gerekiyor ama ne zaman, farklı mağazanın onaylanmamış numaralar farklı tarihlerde başlayacak. storeA 15 kadar doğrulanmış olabilir ve storeB 7 kadar doğrulanabilir. Yani yeni bir $verified kurmak gerekir ve yeni bir $unverified her bir mağaza için tüm olanlardan. Farklı tarih aralıkları katedecek çünkü Ama ben sadece, tüm Verifieds birleştirebilirsiniz olamaz. Yani bütün tarihleri ​​daha sonra doğrulanmış eğer yeni ana dizideki Doğrulanmış kalmak, ancak herhangi bir onaylanmamış varsa onlar yeni ana doğrulanmamış diziye gitmek gerekir.

Üzgünüm beri bu yapmaz.

3 Cevap

Much more often, strategic breakthrough will come from redoing the representation of the data or tables. This is where the heart of a program lies. Show me your flowcharts and conceal your tables, and I shall continue to be mystified. Show me your tables, and I won't usually need your flowcharts; they'll be obvious.

-Frederick P. Brooks, Jr, Fantezi Man-Ay

Sana $total_verified ve tüm mağazalar için $total_unverified dizileri oluşturmak istediğinizi varsayalım.

  1. $total_unverified $earliest_unverified_date en erken tarihte izleyebilmek tüm mağazalar için $unverified dizileri oluşturun.

  2. Kayıt tarihi olan ve kendisine değer katacak $earliest_unverified_date else daha erken iff $total_verified tüm mağazalar için her $verified dizi değeri ekleyin {[(3) }] dizisi.

Şey ilişkisel veritabanları tür için yapılmış gibi sorunu geliyor. Bir veritabanını kullanıyor musunuz? Eğer öyleyse, GROUP BY veya ROLLUP Sana bir PHP bazillion hatları kurtarabilecek kullanarak uygun bir sorgu (veya iki sorgu).

I assume you are pulling all these numbers from a database (and if not, why not?), and that your database looks something like

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

o zaman

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

İlk doğrulanmamış tarih bulur ve

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

İstediğin satış toplamlarını alır - veritabanından her zaman tam veri kümesi çekmek zorunda kalmadan!