0

私のコードは、次のように 2 つの列を実行します。

近所 1
レストラン 1


近所 1
レストラン 2


近所 1 レストラン
3


近所 1
レストラン 1
レストラン 2
レストラン 3


$result = mysql_query("SELECT ID,RName,NHood FROM Restaurants ORDER BY NHood ASC, TRIM(LEADING 'The ' FROM RName) ASC",$connect);
$numRows = mysql_num_rows($result);
$middleIndex = (int)(($numRows+1) / 2);

$names = array();
while($row = mysql_fetch_assoc($result)) {
    $names[] = $row['RName'];
    $id[] = $row['ID'];
    $hood[] = $row['NHood'];
}

// print the left column
echo "<table>";
echo "<tr>";
echo "<td width=60%>";
echo "<div id=\"left\">\n";
for($i = 0; $i < $middleIndex; $i++) {
    echo $hood[$i];
    echo "<p><a href=\"Restaurant.php?ID=".$id[$i]."\">$names[$i]</a></p>\n";
}
echo "</div>\n";
echo "</td>";

// print the right column
echo "<td>";
echo "<div id=\"right\">\n";
for($i = $middleIndex; $i < $numRows; $i++) {
    echo $hood[$i];
        echo "<p><a href=\"Restaurant.php?ID=".$id[$i]."\">$names[$i]</a></p>\n";
}
echo "</div>\n";  
echo "</tr>";
echo "</table>";
4

1 に答える 1

1

必要なロジックは次のとおりです(疑似コード):

SELECT
    ID,
    RName,
    NHood
FROM
    Restaurants
ORDER BY
    NHood ASC, RName ASC

これにより、最初に近所、次にレストラン名で並べ替えられた結果のリストが返されます。

次に、これらの結果を行ごとに処理して、ビューに必要なデータ構造を持つネストされた配列を作成します。

$neighborhoods = array();

foreach($result as $row)
{
    // Add each restaurant to a list named for the current neighborhood
    $neighborhoods[$row['NHood']][] = $row['RName'];
}

これにより、次のようなデータ構造が生成されます。

$neighborhoods = array(
    'neighborhood1' => array(
        'restaurant1',
        'restaurant2',
        'restaurant3',
    ),
    'neighborhood2' => array(
        'restaurant1',
        'restaurant2',
    ),
)

次に、これを実行して使用します。

foreach($neighborhoods as $neighborhood => $restaurants)
{
    echo $neighborhood;
    foreach($restaurants as $restaurant)
    {
        echo $restaurant;
    }
}

リストが非常に大きく、メモリが心配な場合は、実装が少し異なりますが、ロジックは同じです。この手法は高速ですが、プレゼンテーションとデータ層のロジックがすべて混在しているため、読み取りと保守が少し難しくなります。

$currentNH = null;

while($row = fetch_row($results))
{
    // Detect when the neighborhood changes
    if($currentNH != $row['NHood']) {
        echo $row['NHood'];
    }

    echo $row['RName'];
}
于 2012-12-27T02:54:34.703 に答える