-1

同じ概念を使用したい別のページに取り組んでいるので、これを再訪しています。 このページには、MSSQL サーバーから現在取得している出力が表示されます。

イベントが発生する会場情報 (名前、住所など) のテーブルがあります。これとは別に、スケジュールされている実際のイベントの表があります (イベントは 1 日に複数回、および/または複数日に発生する場合があります)。これらのテーブルをクエリで結合します (以下を参照)。

<?php
try {
    $dbh = new PDO("sqlsrv:Server=localhost;Database=Sermons", "", "");
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $sql = "SELECT TOP (100) PERCENT dbo.TblSermon.Day, dbo.TblSermon.Date, dbo.TblSermon.Time, dbo.TblSermon.Speaker, dbo.TblSermon.Series, dbo.TblSermon.Sarasota, dbo.TblSermon.NonFlc, dbo.TblJoinSermonLocation.MeetingName, dbo.TblLocation.Location, dbo.TblLocation.Pastors, dbo.TblLocation.Address, dbo.TblLocation.City, dbo.TblLocation.State, dbo.TblLocation.Zip, dbo.TblLocation.Country, dbo.TblLocation.Phone, dbo.TblLocation.Email, dbo.TblLocation.WebAddress
        FROM dbo.TblLocation RIGHT OUTER JOIN dbo.TblJoinSermonLocation ON dbo.TblLocation.ID = dbo.TblJoinSermonLocation.Location RIGHT OUTER JOIN dbo.TblSermon ON dbo.TblJoinSermonLocation.Sermon = dbo.TblSermon.ID
        WHERE (dbo.TblSermon.Date >= { fn NOW() })
        ORDER BY dbo.TblSermon.Date, dbo.TblSermon.Time";
    $stmt = $dbh->prepare($sql);
    $stmt->execute(); 
    $stmt->setFetchMode(PDO::FETCH_ASSOC);
    foreach ($stmt as $row) {
        echo "<pre>";
        print_r($row);
        echo "</pre>";
    }
    unset($row);
    $dbh = null;
}
catch(PDOException $e) {
    echo $e->getMessage();
}
?>

そのため、クエリ結果をループするときに、レコードごとに配列が作成されます。

Array
(
    [Day] => Tuesday
    [Date] => 2012-10-30 00:00:00.000
    [Time] => 07:00 PM
    [Speaker] => Keith Moore
    [Location] => The Ark Church
    [Pastors] => Alan & Joy Clayton
    [Address] => 450 Humble Tank Rd.
    [City] => Conroe
    [State] => TX
    [Zip] => 77305.0
    [Phone] => (936) 756-1988
    [Email] => info@thearkchurch.com
    [WebAddress] => http://www.thearkchurch.org
)
Array
(
    [Day] => Wednesday
    [Date] => 2012-10-31 00:00:00.000
    [Time] => 07:00 PM
    [Speaker] => Keith Moore
    [Location] => The Ark Church
    [Pastors] => Alan & Joy Clayton
    [Address] => 450 Humble Tank Rd.
    [City] => Conroe
    [State] => TX
    [Zip] => 77305.0
    [Phone] => (936) 756-1988
    [Email] => info@thearkchurch.com
    [WebAddress] => http://www.thearkchurch.org
)
Array
(
    [Day] => Tuesday
    [Date] => 2012-11-06 00:00:00.000
    [Time] => 07:00 PM
    [Speaker] => Keith Moore
    [Location] => Fellowship Of Faith Christian Center
    [Pastors] => Michael & Joan Kalstrup
    [Address] => 18999 Hwy. 59
    [City] => Oakland
    [State] => IA
    [Zip] => 51560.0
    [Phone] => (712) 482-3455
    [Email] => ffcc@frontiernet.net
    [WebAddress] => http://www.fellowshipoffaith.cc
)
Array
(
    [Day] => Wednesday
    [Date] => 2012-11-14 00:00:00.000
    [Time] => 07:00 PM
    [Speaker] => Keith Moore
    [Location] => Faith Family Church
    [Pastors] => Michael & Barbara Cameneti
    [Address] => 8200 Freedom Ave NW
    [City] => Canton
    [State] => OH
    [Zip] => 44720.0
    [Phone] => (330) 492-0925
    [Email] => 
    [WebAddress] => http://www.myfaithfamily.com
)

私がやりたいのは、これらの配列を何らかの方法で組み合わせて、会場情報が毎回繰り返されるのではなく、各日付/時刻が表示されるようにすることです。

配列スタイルで入力しようとしましたが、適切な多次元性がわかりませんでした。それが最終的な方法であるため、表示したい方法を貼り付けているだけです。

The Ark Church
    Contact:
        Alan & Joy Clayton
        450 Humble Tank Rd.
        Conroe, TX  77305
        (936) 756-1988
        info@thearkchurch.com
        http://www.thearkchurch.org
    Meetings:
        Tuesday, 2012-10-30 07:00 PM
        Wednesday, 2012-10-31 07:00 PM

Fellowship Of Faith Christian Center
    Contact:
        Michael & Joan Kalstrup
        18999 Hwy. 59
        Oakland, IA  51560
        (712) 482-3455
        ffcc@frontiernet.net
        http://www.fellowshipoffaith.cc
    Meetings:
        Tuesday, 2012-11-06 07:00 PM

Faith Family Church
    Contact:
        Michael & Barbara Cameneti
        8200 Freedom Ave NW
        Canton, OH  44720
        (330) 492-0925
        http://www.myfaithfamily.com
    Meetings:
        Wednesday, 2012-11-14 07:00 PM

必ずしもそのようになる必要はありませんが、私が探しているものをよく理解できるはずです。

必ずしも新しい配列を作成する必要はありません。同じ情報を何度も何度も表示したくないだけです。

「場所が以前の場所と同じ場合」という行に沿って何かを言うという点で、何らかの形式の比較を行うことができると考えforeach()ていましたが、それを行う方法がわかりません(キャッシュする方法はありますか? $location1 = [Location]、などを行う前の変数$location2 = [Location]...?

1 つの注意点...

これらの例には異なるスピーカーはありませんが、異なるスピーカーがある場合があります。どうにかしてスピーカーにアクセスできるようにしたいと思います。実際のイベントにバインドしたいと思います。

JJ

4

2 に答える 2

0

私は通常、このような問題に対処するために、2 次元配列を作成し、日付の次に ID でインデックスを付けるか、この場合は ID の次に日付でインデックスを付けます。

イベント (最初の次元) をループし、そのイベントの内容を出力します。その間、そのイベントの日付をループし、例のようにリストとして出力します。

于 2012-06-18T16:20:03.483 に答える
0

1 つのテクニック: 次のようなループがある場合:

while ($row = $query->fetch(PDO::FETCH_NUM) ) {
    list($time,$place,$etc) = $row;
    // display formatted data
}

代わりにこれを試してください:

$row = $query->fetch();
do {
    list($time,$place,$etc) = $row;
    $row = $query->fetch(PDO::FETCH_NUM);
    if ($time != $row[0] && $place != $row[1] && $etc != $row[2]) {
        // display formatted data
    }
} while ($row);
于 2012-06-18T16:15:14.727 に答える