PHP - 在Sprintf输出中逐行提取

时间:2015-08-03 17:07:45

标签: php

我有一个CSV文件,我用来填充表格 - 工作正常。该表是一个查询表,因此用户可以选择他们想要更多信息的项目并提交电子邮件。

在此电子邮件中,我需要包含商品详情。到目前为止,我只能在要提交的行中获得“1”字段的值。

在我的搜索中,我找到了一种方法,可以将行中所需的字段转换为一行,但我似乎无法弄清楚如何将每一行单独用作复选框的值。

这是我的代码:

$file = fopen('myfile.csv', 'r'); 
$fields = array(); 

if ($file) {
while (($data = fgetcsv($file)) !== false) {
    if(empty($fields)) {
        $fields = $data;
        continue;
    }

    $row = array_combine($fields, $data);

    $output = sprintf("%s - %s - %u <br />\n",
$row['make'],
$row['model'],
$row['serial']);      

    echo $output;
}
fclose($file);
}

这会创建一个像......

这样的列表
Tanglewood - TW66 - 311592807

MICHAEL KELLY - MKDF4FL - 311595895

Epiphone - DR500MCE - 311599764

ALVAREZ - MD70CE - 311603486

FENDER - *CD220SCE ASH BURL - 311606198 

哪个是完美的......但是在表格中我有复选框来选择查询。该复选框只需要具有该行的值,因此我需要计算行数,然后为我们所在的任何数字行抓取1行。

echo $output[3];这样的东西会给我 Epiphone - DR500MCE - 311599764

编辑---

<form action="<?php echo $_SERVER['REQUEST_URI'] ?>" method="post">
    <table class="tablesaw" data-tablesaw-sortable data-tablesaw-sortable-switch>
        <thead>
            <tr>
<th scope="col" data-tablesaw-sortable-col data-tablesaw-priority="2"></th>
                <th scope="col" data-tablesaw-sortable-col data-tablesaw-priority="persist">Make</th>
                <th scope="col" data-tablesaw-sortable-col data-tablesaw-priority="1">Model</th>

                <th scope="col" data-tablesaw-sortable-col data-tablesaw-priority="2">Serial</th>
                <th scope="col" data-tablesaw-sortable-col data-tablesaw-priority="3">RPD</th>
                <th scope="col" data-tablesaw-sortable-col data-tablesaw-priority="4">Retail</th>
                <th scope="col" data-tablesaw-sortable-col data-tablesaw-priority="5">Net Price</th>
                <th scope="col" data-tablesaw-sortable-col data-tablesaw-priority="6">Photo</th>
            </tr>
        </thead>
        <tbody>

<?php
$file = fopen('file.csv', 'r');
$fields = array();
if($file)
{
while(($data=fgetcsv($file, ',')) !== false)
 {
  if(empty($fields))
 {
  $fields = $data;
 continue;
}
 $row = array_combine($fields, $data);
 $output[] = sprintf("%s - %s - %u <br />\n", $row['make'], $row['model'], $row['serial']);
}
 fclose($file);

}

 for($x=0; $x < count($output); $x++)
  {
// Build lines of checkbox rows here
echo($output[$x]);
}
?>


<?php 
$f = fopen("file.csv", "r");


$columns1 = array(1);
$columns2 = array(2,3,4,5,6);
$columns3 = array(7);


$flag = true;



while (($line = fgetcsv($f)) !== false) {
if($flag) { $flag = false; continue; }
    echo "<tr>";
    foreach ($line as $index=>$val) {


if (in_array($index+1, $columns1)) {
echo("\t<td><input type='checkbox' name='checkboxvar[]' value='$val'></td>\r\n");
}


if (in_array($index+1, $columns1)) {
echo("\t<td>$val</td>\r\n");
}


if (in_array($index+1, $columns2)) {
echo("\t<td>$val</td>\r\n");
}

if (in_array($index+1, $columns3)) {

if($val == "0"){
    echo("\t<td></td>\r\n");
} else {
     echo("\t<td><a class=' wpex-lightbox' href='http://mirc.pixelcraftstudio.net/wp-content/uploads/mirc_inv_pics/$val.jpg' target='_self' data-type='image'><img style='width:24px; height:24px; margin-top:8px;' src='http://mirc.pixelcraftstudio.net/wp-content/themes/mirc-child/tablesaw/icon-instagram.jpg'/></a></td>\r\n");
    }
            }

    }
    echo "</tr>\n";
}
fclose($f);
?>

        </tbody>
    </table>

<input style="position:fixed; bottom:0px; left:50%; font-size:16px; margin- left:-155px;" name="submit" type="submit" value="Contact Us About Your     Selected Items" />
</form>

2 个答案:

答案 0 :(得分:0)

我认为你需要创建一个数组,目前你的代码不会这样做。尝试更改此行:

$output = sprintf("%s - %s - %u <br />\n", $row['make'], $row['model'], $row['serial']);

为:

$output[] = sprintf("%s - %s - %u <br />\n",$row['make'], $row['model'], $row['serial']);

现在: echo $output[3];等应包含您的数据。

您可能需要像这样构建数组:

$output[] = array("make"=>"$row['make']", "model"=>"$row['model']", "serial"=>"$row['serial']");

现在: echo $output[3]['make'];等应包含您的'make'数据,对每个数组元素重复('model'和'serial')。

编辑 - 新代码

我没有解决你的桌子建筑需求。我所做的只是将数据转换为您请求的格式。我的原始代码有几个问题,它没有像你发布的那样运行。 $ fields包含7个元素,$ data包含6个元素。因此,array_combine()失败。我不得不在csv文件的最后一个元素中添加'null'。我将您的示例数据加载到Excel中并从中创建了一个csv文件。此外,键是区分大小写的,因此$ row ['make']必须变为$ row ['Make'],....等。数组基于0,因此echo($output[2])将输出Epiphone - DR500MCE - 311599764 。我希望这符合您的需求。

$file = fopen('inventory.csv', 'r');
$fields = array();
if($file)
{
 while(($data=fgetcsv($file, ',')) !== false)
 {
  if(empty($fields))
  {
   $fields = $data;
   continue;
  }
  $row = array_combine($fields, $data);
  $output[] = sprintf("%s - %s - %u <br />\n", $row['Make'], $row['Model'], $row['Serial']);
 }
 fclose($file);
 foreach($output as $key=>$value)
 {
  // Build lines of checkbox rows here
  echo($key . ': '. $value);
 }
}

修改 - 添加

这很简单,使用for循环而不是foreach循环,如下所示:

 for($x=0; $x < count($output); $x++)
 {
  // Build lines of checkbox rows here
  echo($output[$x]);
 }

这样,您还可以通过将数字值添加到ID来更改每个复选框的id属性。

编辑 - 上次

这是一个完整的网页,它将表格构建为您之前发布的csv页面,并将所需的值放在复选框中。要使生活变得简单,唯一要做的就是更新Excel文件以包含照片路径/名称。务必在该字段中包含开始和结束img标记,你应该好好去。

<!DOCTYPE HTML>
<html>
<head>
<title>Sample Table</title>
</head>
<body>
<form action="<?php echo $_SERVER['REQUEST_URI'] ?>" method="post">
 <table class="tablesaw" data-tablesaw-sortable data-tablesaw-sortable-switch>
  <thead>
   <tr>
    <th scope="col" data-tablesaw-sortable-col data-tablesaw-priority="2">Select</th>
    <th scope="col" data-tablesaw-sortable-col data-tablesaw-priority="persist">Make</th>
    <th scope="col" data-tablesaw-sortable-col data-tablesaw-priority="1">Model</th>
    <th scope="col" data-tablesaw-sortable-col data-tablesaw-priority="2">Serial</th>
    <th scope="col" data-tablesaw-sortable-col data-tablesaw-priority="3">RPD</th>
    <th scope="col" data-tablesaw-sortable-col data-tablesaw-priority="4">Retail</th>
    <th scope="col" data-tablesaw-sortable-col data-tablesaw-priority="5">Net Price</th>
    <th scope="col" data-tablesaw-sortable-col data-tablesaw-priority="6">Photo</th>
   </tr>
  </thead>
  <tbody>
<?php
$file = fopen('inventory.csv', 'r');
$fields = array();
if($file)
{
 while(($data=fgetcsv($file, ',')) !== false)
 {
  if(empty($fields))
  {
   $fields = $data;
   continue;
  }
  $output[] = array_combine($fields, $data);
 }
 fclose($file);
 foreach($output as $main)
 {
  echo('   <tr>' . PHP_EOL);
  echo("    <td><input type='checkbox' name='checkboxvar[]'  value='{$main['Make']} - {$main['Model']} - {$main['Serial']}'></td>");
  foreach($main as $key=>$value)
  {
   echo("<td>$value</td>");
  }
  echo(PHP_EOL . '   </tr>' . PHP_EOL);
 }
}
?>
  </tbody>
 </table>
 <br>
 <input style="position: fixed; bottom: 0px; left: 50%; font-size: 16px; margin-left: -155px;" name="submit" type="submit" value="Contact Us About Your Selected Items">
</form>
</body>
</html>

答案 1 :(得分:0)

以下是我用来生成表格的代码。

<?php 
$f = fopen("file.csv", "r");


$columns1 = array(1);
$columns2 = array(2,3,4,5,6);
$columns3 = array(7);


$flag = true;

while (($line = fgetcsv($f)) !== false) {
if($flag) { $flag = false; continue; }
    echo "<tr>";
    foreach ($line as $index=>$val) {

if (in_array($index+1, $columns1)) {
echo("\t<td><input type='checkbox' name='checkboxvar[]' value='$val'>    </td>\r\n");
}


if (in_array($index+1, $columns1)) {
echo("\t<td>$val</td>\r\n");
}

if (in_array($index+1, $columns2)) {
echo("\t<td>$val</td>\r\n");
}

if (in_array($index+1, $columns3)) {

if($val == "0"){
    echo("\t<td></td>\r\n");
} else {
     echo("\t<td><a class=' wpex-lightbox' href='http://mirc.pixelcraftstudio.net/wp-content/uploads/mirc_inv_pics/$val.jpg' target='_self' data-type='image'><img style='width:24px; height:24px; margin-top:8px;' src='http://mirc.pixelcraftstudio.net/wp-content/themes/mirc-child/tablesaw/icon-instagram.jpg'/></a></td>\r\n");
    }
            }

    }
    echo "</tr>\n";
}
fclose($f);
?>

所以第一列我有复选框,并且可以得到第一列显示第一列的值。但我需要将第1,2和3列的值包含在复选框中。

也许我首先获得3项的思考方法不是最好的方法吗?

第7列仅拆分,因为它的图像需要预览图标