爆炸中未定义的偏移问题

时间:2013-04-28 21:24:44

标签: php csv explode

首先,我为提出一个必须有点新手或简单的问题而道歉,但我似乎找不到任何我研究过的代码来解决我的问题。

注意:未定义的偏移量:第14行的C:\ Users \ Joshua \ Desktop \ USBWebserver v8.5 \ 8.5 \ root \ Assignment \ Table.php中的1

此错误从偏移1 - 7继续。

我目前用于从CSV文件中提取数据的代码如下:

<?php
$fp = fopen ("quotes.csv","r");
if (!$fp) {echo "<p>Unable to open remote file.</p>"; exit;}
?>
<table>
<tr><th>ID</th> <th>Price</th> <th>Volume </th></tr>
<?php

$i=0;
while (!feof($fp)):
   $line = fgets($fp, 2048);
   $out[$i] = array($line);

   list ($ID, $Price, $StockDate, $StockTime, $Change, $DayHI, $DayLOW, $Volume,) = explode(",", $out[$i][0]);


   echo "<tr><td>$ID</td> <td>$Price</td> <td>$StockDate </td><td>$StockTime</td> <td>$Change</td> <td>$DayHI</td> <td>$DayLOW</td> <td>$Volume</td></tr>";
   $fp++;
   $i++;
endwhile;

?>
</table>
<?php


//echo "<p>".$out[0][0]."</p>";
//echo "<p>".$out[1][0]."</p>";
//echo "<p>".$out[2][0]."</p>";
fclose($fp);
?>

由于从CSV调用正确数量的值,我不确定某些内容是如何定义的。

我知道这不是一个教授某人PHP基础知识的网站,但任何建议都会受到赞赏,以帮助解决问题,我将非常感激!

4 个答案:

答案 0 :(得分:1)

我认为你不想在文件指针上+1:

$fp++;

删除此行应该可以解决问题。

<强>更新

你也应该检查fgets是否错误,因为它意味着文件结束:

$line = fgets($fp, 2048);
if($line === false) break;

完全正常的例子:

<?php
$fp = fopen ("quotes.csv","r");
if (!$fp) {echo "<p>Unable to open remote file.</p>"; exit;}
?>
<table>
<tr><th>ID</th> <th>Price</th> <th>Volume </th></tr>
<?php
$out = array();
$i=0;
while (!feof($fp)):
   $line = fgets($fp, 2048);
   if($line === false) break;
   $out[$i] = array($line);

   list ($ID, $Price, $StockDate, $StockTime, $Change, $DayHI, $DayLOW, $Volume) = explode(",", $out[$i][0]);


   echo "<tr><td>$ID</td> <td>$Price</td> <td>$StockDate </td><td>$StockTime</td> <td>$Change</td> <td>$DayHI</td> <td>$DayLOW</td> <td>$Volume</td></tr>";
   $i++;
endwhile;

?>
</table>
<?php


echo "<p>".$out[0][0]."</p>";
fclose($fp);

最后echo给了我来自.csv的第一个字符串。

答案 1 :(得分:0)

尝试为爆炸值创建单个变量,并检查变量是否包含所有数据

$temporal_var = explode(",", $out[$i][0]);
print_r($temporal_var);

答案 2 :(得分:0)

您是否已初始化$out数组?而且对于我所看到的你不需要$i索引,因为你只需要调用$out[] = array($line);将一个元素附加到数组

答案 3 :(得分:0)

使用本机php CSV处理程序尝试此方法:

<?php 
// Set a list of headers
$ths[0] = 'ID';
$ths[1] = 'Price';
$ths[2] = 'StockDate';
$ths[3] = 'StockTime';
$ths[4] = 'Change';
$ths[5] = 'DayHI';
$ths[6] = 'DayLOW';
$ths[7] = 'Volume';

// Open the file with error handling
$fp = fopen('quotes.csv', 'r');
if( !$fp ) { die('<p>Unable to open remote file.</p>'); }
// Get the size
$fz = filesize('quotes.csv') + 1;
// Create a Data holder array
$fpData = array();
// While there is a line. Use native fgetcsv()
while ( $fpRow = fgetcsv( $fp, $fz, ',' ) ) {
    // For each element in the row we asign it to its header
    for ($i=0; $i < count($fpRow); $i++) { 
        $thisRow[ $ths[$i] ] = $fpRow[ $i ];
    }
    // Append to the Data array
    $fpData[] = $thisRow;
}
// Close the file
fclose($fp);
// Test the output
// print_r( $fpData );
?>

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Get CVS</title>
</head>
<body>
    <table>
        <thead>
            <tr>
                <?php foreach ($ths as $thisField): ?>
                    <th><?php echo $thisField ?></th>
                <?php endforeach ?>
            </tr>
        </thead>
        <tbody>
            <?php foreach ($fpData as $thisItem): ?>
                <tr>
                    <td><?php echo $thisItem['ID'] ?></td>
                    <td><?php echo $thisItem['Price'] ?></td>
                    <td><?php echo $thisItem['StockDate'] ?></td>
                    <td><?php echo $thisItem['StockTime'] ?></td>
                    <td><?php echo $thisItem['Change'] ?></td>
                    <td><?php echo $thisItem['DayHI'] ?></td>
                    <td><?php echo $thisItem['DayLOW'] ?></td>
                    <td><?php echo $thisItem['Volume'] ?></td>
                </tr>
            <?php endforeach ?>
        </tbody>
    </table>
</body>
</html>