0

こんにちは誰かが私が昨夜別の質問を通してこのコードのいくつかを書くのを手伝ってくれました:HTMLテーブルを変換する

私はそれにいくつかの変更を加えました、そして私は再び少し立ち往生しています。

基本的に、$resultsは一連のフィルムです。配列内の最初の文字が変更されるたびに、最初の文字を含む個別のエントリを含むようにフォーマットしました。

これはそれを行うコードです:

while (false !== ($entry = readdir($handle)) ) {
    if($entry == "." or $entry == "..") 
        continue;

    if($i == 0) {
        array_push($results,substr($entry, 0,1));
    } else if (substr($entry, 0,1) != substr($lastEntry, 0,1)) {
        array_push($results,substr($entry, 0,1));
    }
    $lastEntry = $entry;
    array_push($results,$entry);
    $i++;
}

これにより、次のような配列になります。

Array ( 
    [0] => 0 
    [1] => 007, A View to a Kill (1985) 
    [2] => 1 
    [3] => 127 Hours (2010) 
    [4] => A 
    [5] => A Clockwork Orange (1971) 
    [6] => B 
    [7] => Back to the Future (1985) 
    [8] => Butterfly on a Wheel (2007) 
    [9] => C 
    [10] => Carnage (2011) 
    [11] => Casino (1995)  
    [12] => D 
    [13] => Defiance (2008) 
)

したがって、基本的には、各インデックス(0、1、A、Cなど)に異なるCSSクラスを与え、それに2の行スパンを与えるテーブルを作成したいと思います。これは私が行いました。正しく見えるテーブルを作成します。以下のコードは、rowspan = 2のセルを追加し、次の行にnumber_of_cols-$ indexRowが出力されると、$indexRowをインクリメントします。上記の行のrowspan=2セルは、現在の行のセルの1つを占めます。

$NUM_COLUMNS = 3;

$numRows = count($results) / $NUM_COLUMNS;
if (count($results) % $NUM_COLUMNS > 0) {
    $numRows += 1;
}

echo "<div align=\"center\"><table>";
$i=0;
$indexRow=0;
for ($i = 0; $i < $numRows; $i++) {
    echo "<tr>\n";

    $index = $i;
    $j=0;

    if($indexRow > 0) {
        $j+=$indexRow;
        $indexRow=0;
    }

    while ($j < $NUM_COLUMNS) {
        $entry = '';
        if ($index < count($results)) {
           $entry = $results[$index];
        }
        if(strlen($entry) < 2) {
            echo "\t<td rowspan=\"2\" class=\"movieindex\">" . $entry . "</td>\n";
            $indexRow++;
        } else {
            echo "\t<td>" . $entry  . "</td>\n";
        }   
        $index += $numRows;

        $j++;
    }
    echo "</tr>\n";
}
echo "</table></div>";

私の実際の問題は、rowspan=2セルでムービーが正しく順序付けられていないことです。映画は縦に並べる必要がありますが、インデックスセルによってスローされます。どうすればこれを回避できるかわかりません、何かアイデアはありますか?

これは私が得るテーブルです:

<div align="center">
<table>
<tr>
    <td rowspan="2" class="movieindex">0</td>
    <td>Hancock (2008)</td>
    <td>Sin City (2005)</td>
</tr>
<tr>
    <td>007, A View to a Kill (1985)</td>
    <td>Hangover (2009)</td>
</tr>
<tr>
    <td>007, Diamonds Are Forever (1971)</td>
    <td>Happy Feet Two (2011)</td>
    <td>Snow White (1987)</td>
</tr>

これが私が欲しいものです:

<div align="center">
<table>
<tr>
    <td rowspan="2" class="movieindex">0</td>
    <td>Hancock (2008)</td>
    <td>Sin City (2005)</td>
</tr>
<tr>
    <td>Hangover (2009)</td>
    <td>Snow White (1987)</td>
</tr>
<tr>
    <td>007, A View to a Kill (1985)</td>
    <td>Happy Feet Two (2011)</td>
    <td>Step Brothers (2008)</td>
</tr>

さらに説明が必要な場合は、質問してください。編集します。基本的に私が求めているのは、セルを垂直に正しく並べるにはどうすればよいですか?

たぶん、これは私がやろうとしていることを理解するのに役立つでしょう:http: //imageshack.us/f/163/exampletable.png/

4

1 に答える 1

1

コメントで述べたように、汚い解決策として、配列のインデックスの後にプレースホルダーを追加し、コードに表示しないようにすることができます。

} else if (substr($entry, 0,1) != substr($lastEntry, 0,1)) {
    array_push($results,substr($entry, 0,1));
    array_push($results,"");
}

これにより、次のような配列になります。

Array ( 
    [0] => 0
    [1] => 
    [2] => 007, A View to a Kill (1985) 
    [3] => 1 
    [4] => 
    [5] => 127 Hours (2010)
);

コードを次のように変更した場合:

if(strlen($entry) == 1) {
    echo "\t<td rowspan=\"2\" class=\"movieindex\">" . $entry . "</td>\n";
    $indexRow++;  // This might be unneeded now, did not test this myself
} else if(strlen($entry) == 0){
     // Do nothing, just a placeholder
} else {
    echo "\t<td>" . $entry  . "</td>\n";
}
于 2012-05-19T12:03:24.410 に答える