我正在使用php将数据从文本文件(非csv)输出到html表中。我正在分解数据,它以数组的形式返回,但是当我使用foreach循环时,数据又变成了一个字符串,所以我无法进行sort()。同样,数据以每本书和作者的副本形式打印到表中5次。如何将我的数组保持为foreach循环中的数组,以便可以对其进行排序?如何只将每一行显示在html表中一次? (要正确循环以获取我想要的显示?)。
PHP
<?php
$filename = 'books.txt';
list($rows, $html_table ) = returnTable($filename);
if (empty($rows))
{
print "<p>Total Rows in Table: ".$rows."</p>";
print $html_table;
}
else
{
print "No file found";
}
//Read Information from a File into an HTML table
function returnTable($filename)
{
$arr = array();
$html_table = "<table border='2'>";
$html_table.= "<tr>";
$html_table.= "<th>Title</th>";
$html_table.= "<th>Author</th>";
$html_table.= "</tr>\n";
$line_ctr = 0;
$fp = fopen($filename, 'r');
if ($fp)
{
while(true)
{
$line = fgets($fp);
if (feof($fp))
{
break;
}
$line_ctr++;
$arr = list($title, $author) = explode('*', $line);
//var_dump($arr); // returns an array but changes to a string in the loop below!
foreach($arr as $books){
$html_table.= "<tr>";
$html_table.= "<td>".$title."</td>";
$html_table.= "<td>".$author."</td>";
$html_table.= "</tr>\n";
}//END OF FOREACH LOOP
} //END OF WHILE LOOP
$html_table.= "</table>";
fclose($fp ); //Close file
//AT THIS POINT html_table is a string again but why?
$return_data = array($line_ctr, $html_table);
} else {
$return_data = array("error", "No Content here");
}
return $return_data;
}
?>
答案 0 :(得分:1)
从代码中的注释看来,您正在将$ arr和$ html_table混淆为同一变量。 $ arr始终是一个数组。 $ html_table始终是字符串。
因为foreach循环在while循环内,所以您得到重复。
您似乎需要从while循环中删除foreach循环。 while循环完成后,在$ arr上进行所需的排序,然后运行foreach循环以创建html表。
我会尝试以下操作:
将$arr = list($title, $author) = explode('*', $line);
更改为$books[] = list($title, $author) = explode('*', $line);
这将使$ books成为一个多维数组,如下所示:
Array (
[0] => Array
(
[0] => The Shining
[1] => Stephen King
)
[1] => Array
(
[0] => Interview With The Vampire
[1] => Anne Rice
)
)
将foreach循环移到while循环之外,像这样更新foreach循环:
foreach($books as $book) {
$html_table .= "<td>" . $book[0] . "</td>";
$html_table .= "<td>" . $book[1] . "</td>";
}
我不确定您需要进行哪种排序,因此您可能需要创建与本示例不同的图书数组。
答案 1 :(得分:0)
尝试从函数输出3个变量。
将其分为三部分,表头,循环内容和表脚。
函数输出类似
list($table_header, $rows, $table_footer ) = returnTable($filename);
在函数中,使$ arr数据仅输出为$ rows。
然后最终的html输出类似
echo $table_header.$rows.$table_footer
答案 2 :(得分:0)
此状态下的代码中包含许多小错误,这些错误会阻止您获得预期的结果。我在注释中添加了解释,因此请注意它们,以免日后避免此类错误:
$filename = 'books.txt';
list($rows, $html_table ) = returnTable($filename);
if ($rows>0)//here i change something look out
{
print "<p>Total Rows in Table: ".$rows."</p>";
print $html_table;
}
else
{
print "No file found";
}
//Read Information from a File into an HTML table
function returnTable($filename)
{
// $arr = array();you don't need at all this
$html_table = "<table border='2'>";
$html_table.= "<tr>";
$html_table.= "<th>Title</th>";
$html_table.= "<th>Author</th>";
$html_table.= "</tr>\n";
$line_ctr = 0;
$fp = fopen($filename, 'rb');
if ($fp)
{
while(true)
{
$line = fgets($fp);
$line_ctr++;
/*$arr = */list($title,$isbn, $author) = explode('*', $line);//i got a sample of the books.txt content from your previous question so i add isbn but you can remove it
// foreach($arr as $books){ no no and no
$html_table.= "<tr>";
$html_table.= "<td>".$title."</td>";
$html_table.= "<td>".$isbn."</td>";
$html_table.= "<td>".$author."</td>";
$html_table.= "</tr>\n";
// }//END OF FOREACH LOOP
if (feof($fp)) //will now allow the last element to be fetched too
{
break;
}
} //END OF WHILE LOOP
$html_table.= "</table>";
fclose($fp ); //Close file
$return_data = array($line_ctr, $html_table);
} else {
$return_data = array("error", "No Content here");
}
// return $rtn; no
return $return_data;
}
此代码可以完美运行。我知道它是因为我通过与您先前相关问题的样本进行了测试
但是基于此评论:
这有效并将数据带回到表中,但将数据带到表中 以字符串形式返回。我还需要能够对数据进行排序。你是否可以 在此代码中实现sort()?
使用fopen和fgets的代码中的实现排序可能确实很复杂且令人痛苦,但是以下代码应满足您的期望:
function returnTable($filename,$sortby='title',$sortType=SORT_REGULAR,$sortOrder=SORT_ASC)
{
$column=[];
$line_ctr = 0;
$books= array_map(
function($val) use(&$column,$sortby,&$line_ctr){
$line_ctr++;
$val=array_combine(['title','isbn','author'],array_map('trim',str_getcsv($val,'*')));
$column[]=$val[strtolower($sortby)];
return $val;
},
file($filename,FILE_SKIP_EMPTY_LINES|FILE_IGNORE_NEW_LINES));
if($books){
$sortOrder=$sortOrder!==SORT_ASC&&$sortOrder!==SORT_DESC?SORT_ASC:$sortOrder;
$sortType=in_array( $sortType,
[
SORT_REGULAR ,SORT_NUMERIC,SORT_STRING ,
SORT_LOCALE_STRING ,SORT_NATURAL,SORT_FLAG_CASE,
SORT_FLAG_CASE|SORT_STRING,SORT_FLAG_CASE|SORT_NATURAL
],
true
)?$sortType:SORT_REGULAR;
$html_table = "<table border='2'>";
$html_table.= "<tr>";
$html_table.= "<th>Title</th>";
$html_table.= "<th>ISBN</th>";
$html_table.= "<th>Author</th>";
$html_table.= "</tr>\n";
array_multisort($column,$sortOrder,$sortType,$books);
unset($column);
array_map(
function($book) use(&$html_table){
list($title,$isbn, $author) = array_values($book);
$html_table.= "<tr>";
$html_table.= "<td>".$title."</td>";
$html_table.= "<td>".$isbn."</td>";
$html_table.= "<td>".$author."</td>";
$html_table.= "</tr>\n";
}
,
$books
);
$html_table.= "</table>";
$return_data = array($line_ctr, $html_table);
} else {
$return_data = array("error", "No Content here");
}
return $return_data;
}
使用这种类型的SORT_REGULAR ,SORT_NUMERIC,SORT_STRING ,SORT_LOCALE_STRING,SORT_NATURAL,SORT_FLAG_CASE,SORT_FLAG_CASE|SORT_STRING,SORT_FLAG_CASE|SORT_NATURAL