如何正确地将php变量插入表格单元格?

时间:2013-12-16 23:53:11

标签: php html function

我知道这听起来有点令人困惑,但请允许我进一步解释。

我有一个php函数打印表格顶部,包括html标签,如下所示:

function print_table_head (){
    echo "<table>
            <thead>
              <tr>
                <th>URL Link</th>
                <th>Date Start</th>
                <th>Date End</th>
                <th>Total Budget</th>
                <th>Daily Budget</th>
                <th>Model Price</th>
                <th>Unit Rate</th>
                <th>Target Info</th>
                <th>Product</th>
                <th>Status</th>
                <th>Total Units</th>
              </tr>
            </thead>
            <tbody>";
  }

我还有一个用html表结束标记关闭表的函数,如下所示:

function print_table_bottom(){
    echo "</tbody>
          </table>";
  }

现在,桌子打印得很好,花花公子到这里。我得到了正确的表格和每件事。但我无法打印桌面和内容。这是我的主要功能用于打印整个表格的内容,包括它的正文和内容:

function print_table ( $status, $model, $bid, $url, $target, $tBudget,$dBudget, $tUnits, $sMonth, $sDay, $sYear, $eMonth, $eDay, $eYear ){
    print_table_head();

    echo "<tr>
            <td><?php $url[0]; ?></td>
            <td><?php $sMonth[0] / $sDay[0] / $sYear[0];  ?></td>
            <td><?php $eMonth[0]; / $eDay[0]; / $eYear[0];  ?></td>
            <td><?php $tBudget[0]; ?></td>
            <td><?php $dBudget[0]; ?></td>
            <td><?php $model[0]; ?></td>
            <td><?php $targeting[0]; ?></td>
            <td><?php $product[0]; ?></td>
            <td><?php $status[0]; ?></td>
            <td><?php $tUnits[0]; ?></td>
          </tr>";

    print_table_bottom();

  }

每次调用“print_table”函数时,它都会打印表格顶部的标题。但它不会打印表格行/单元格。我不确定我做错了什么。有人可以为我清楚这一点并告诉我我做错了什么吗?

注意=我正在使用foundation-5。不确定这是否重要。

此外,使用的每个变量都是一个数组(它们都有1个元素......是的我知道,我可能没有为每个变量使用数组,但我想。)

编辑:

根据评论者的要求,我将提供调用print_table的代码:

<?php
    //if the length of the array "status" is 1.
    if (count($status)==1){
      print_table ( $status, $model, $bid, $url, $target, $tBudget,$dBudget, $tUnits,$sMonth,$sDay,$sYear,$eMonth, $eDay, $eYear );
    }
    // please ignore this function. 
    else

      print_table_with_multiple_rows ( $status, $model, $bid, $url, $target, $tBudget,$dBudget, $tUnits,$sMonth,$sDay,$sYear,$eMonth, $eDay, $eYear );
  ?>

3 个答案:

答案 0 :(得分:2)

简单选项

最简单的选择是重新格式化您的数据结构并使用此代码:

$data = // Structure: array([0] => array('url' => '', 'sMonth' => '', 'eMonth' => '', ...), [1] => array(...));
include 'templates/table.php';

模板/ table.php

<table>
    <thead>
        <tr>
            <th>URL Link</th>
            <th>Date Start</th>
            <th>Date End</th>
            <th>Total Budget</th>
            <th>Daily Budget</th>
            <th>Model Price</th>
            <th>Unit Rate</th>
            <th>Target Info</th>
            <th>Product</th>
            <th>Status</th>
            <th>Total Units</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach($data as $row) : ?>

        <td><?php echo $row->url ?></td>
        <td><?php echo $row->sMonth . "/" . $row->sDay . "/" . $row->sYear; ?></td>
        <td><?php echo $row->eMonth . "/" . $eDay . "/" . $eYear;  ?></td>
        <td><?php echo $row->tBudget; ?></td>
        <td><?php echo $row->dBudget; ?></td>
        <td><?php echo $row->model; ?></td>
        <td><?php echo $row->targeting; ?></td>
        <td><?php echo $row->product; ?></td>
        <td><?php echo $row->status; ?></td>
        <td><?php echo $row->tUnits; ?></td>

        <?php endforeach; ?>
    </tbody>
</table>

高级选项(更好)

这可能比其他代码更先进,但它通常是编写(OO)PHP的更合适的方法。但是,它可能需要重组您的所有代码。

目录结构:

--models
    --informationmodel.php
--controllers
    --abstractcontroller.php
    --informationcontroller.php
--templates
    --information
        --table.php

模型/ informationmodel.php

首先是模型类。此模型反映了特定类型的数据 - 在这种情况下,您在表中显示的任何类型的信息。这个类不应该操纵数据 - 它只是一个存储所需数据的类。

class InformationModel { //Where "Information" is changed to describe this data type

    private $data;

    public function __construct($data = array()) { //pass the things as an associative array
        $this->data = $data;
    }

    public function __set($key, $value) {
        $this->data[$key] = $value;
    }

    public function setData($data) {
        $this->data = $data;
    }
}

控制器/ abstractcontroller.php

这是一个抽象控制器。控制器是存储应用程序逻辑的位置。这应该包括数据操作,模型检索等。每个控制器使用抽象类来访问所有控制器通用的特定函数。

abstract class AbstractController {

    // add more functions for all controllers here

    public function renderTemplate($template, $data) {
        include $template;
    }
}

控制器/ informationcontroller.php

这是实际的控制器。在这个控制器中我们可以定义动作 - 在这种情况下,我们将定义一个表动作。这意味着我们可以调用此操作来呈现包含我们提供的数据的表。这很有用,因为如果我们想要改变数据的呈现方式,就很容易这样做。如果我们将其设置为允许您指定数据,我们甚至可以使数据以不同于HTML的格式呈现。现在,我们只需要一个简单的操作:加载数据,并将其提供给模板。

require_once 'models/informationmodel.php'; // note: autoloading would be preferable

class InformationController extends AbstractController {

    public function tableAction($rawData) {

        $data = new InformationModel($rawData);

        $this->renderTemplate('templates/information/table.php', $data);
    }
}

模板/信息/ table.php

这是一个模板。您可以在此处定义希望显示代码的方式。如果你想更进一步,请查看模板引擎,如Twig(我的个人推荐)。这纯粹是为了呈现数据。正如您将看到的,我将模板放入一个文件夹中以显示特定类型的信息:数据类型“信息”的表格(或者您将其更改为的任何内容)。这有助于您保持模板的有序性。

<table>
    <thead>
        <tr>
            <th>URL Link</th>
            <th>Date Start</th>
            <th>Date End</th>
            <th>Total Budget</th>
            <th>Daily Budget</th>
            <th>Model Price</th>
            <th>Unit Rate</th>
            <th>Target Info</th>
            <th>Product</th>
            <th>Status</th>
            <th>Total Units</th>
        </tr>
    </thead>
    <tbody>
        <?php foreach($data as $row) : ?>

        <td><?php echo $row->url ?></td>
        <td><?php echo $row->sMonth . "/" . $row->sDay . "/" . $row->sYear; ?></td>
        <td><?php echo $row->eMonth . "/" . $eDay . "/" . $eYear;  ?></td>
        <td><?php echo $row->tBudget; ?></td>
        <td><?php echo $row->dBudget; ?></td>
        <td><?php echo $row->model; ?></td>
        <td><?php echo $row->targeting; ?></td>
        <td><?php echo $row->product; ?></td>
        <td><?php echo $row->status; ?></td>
        <td><?php echo $row->tUnits; ?></td>

        <?php endforeach; ?>
    </tbody>
</table>

如您所见,我更改了数据结构:数据按行进行操作,这些行每个只包含一个元素。使用模板引擎将减少<?php echo $row->status ?>结构的丑陋 - 在Twig中,它看起来像:{{ row.status }}

然后,实际使用此代码:

您正在使用的任何页面

require_once "controllers/informationcontroller.php"; //even better: use autoloading

// $data =  get your data in here somewhere.

$info = new InformationController();
$info->tableAction($data); // prints out a table;

显然这是很多新信息,但它很有用。如果你花时间学习面向对象的PHP(OOPHP),MVC,模板等等,你将是一个更好的程序员,你的代码将更容易编写和维护。更多主题:Twig,自动加载,依赖注入/控制反转,命名空间,路由

现在,模型类实际上没有做任何事情,我没有使用依赖注入(控制器中的模型类直接依赖,这是不赞成的),但基本概念在这里。现在,您可以直接将数据传递给控制器​​,甚至直接传递给模板。

免责声明:我尚未测试此代码。但是,无论如何都需要进行一些修改。如果你真的想用PHP编写网站,你应该考虑用这种方式构建它。

答案 1 :(得分:1)

嗯..你弄乱了php和html ..

function print_table ( $status, $model, $bid, $url, $target, $tBudget,$dBudget, $tUnits, $sMonth, $sDay, $sYear, $eMonth, $eDay, $eYear ){
    print_table_head();

    echo "<tr>
            <td>{$url[0]}</td>
            <td>{$sMonth[0]} / {$sDay[0]} / {$sYear[0]}</td>
            <td>{$eMonth[0]} / {$eDay[0]} / {$eYear[0]}</td>
            <td>{$tBudget[0]}</td>
            <td>{$dBudget[0]}</td>
            <td>{$model[0]}</td>
            <td>{$targeting[0]}</td>
            <td>{$product[0]}</td>
            <td>{$status[0]}</td>
            <td>{$tUnits[0]}</td>
          </tr>";

    print_table_bottom();

  }

答案 2 :(得分:0)

我个人觉得这个更具可读性:

function print_table ( $status, $model, $bid, $url, $target, $tBudget,$dBudget, $tUnits, $sMonth, $sDay, $sYear, $eMonth, $eDay, $eYear ){
    print_table_head();
    ?>

    <tr>
        <td><?= array_shift($url); ?></td>
        <td><?= array_shift($sMonth), "/", array_shift($sDay), "/", array_shift($sYear); ?></td>
        <td><?= array_shift($eMonth), "/", array_shift($eDay), "/", array_shift($eYear); ?></td>
        <td><?= array_shift($tBudget); ?></td>
        <td><?= array_shift($dBudget); ?></td>
        <td><?= array_shift($model); ?></td>
        <td><?= array_shift($targeting); ?></td>
        <td><?= array_shift($product); ?></td>
        <td><?= array_shift($status); ?></td>
        <td><?= array_shift($tUnits); ?></td>
    </tr>

    <?php
    print_table_bottom();

  }

注意:如果它不起作用,可能是因为您的PHP不接受<?=。在这种情况下,取代<?= <?php echo的所有内容。