为什么我的PHP foreach循环无法正确将数据输出到HTML表中?

时间:2018-09-18 01:23:06

标签: php

我正在使用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;
}
?>

3 个答案:

答案 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

,您应该能够按不区分大小写的列名进行升序或降序排序
相关问题