如何合并未知数量的数组

时间:2013-10-22 15:43:03

标签: php html arrays

我是php的新手,在研究之后我还没有找到我理解的答案。我正在使用PHP与HTML。我正在从文本文件(file_get_contents)读入。我正在做一个餐厅菜单,第一项是“汉堡”(burgers.txt)。第二个是“鸡”等。我使用explode功能分离这些文本文件。这是我的代码

<?php

$dir = 'C:\xampp\htdocs\posplus\txtfiles';
$dh  = opendir($dir);
while (false !== ($filename = readdir($dh))) {
    $files[] = $filename;//array of files
}
$dot = array_shift($files);
$dotdot = array_shift($files);

$numfiles = count($files);//counts number of text files
for($f=0;$f<$numfiles;$f++)
{
$filearray = array();
$filearray[$f] = file("txtfiles/".$files[$f]);  //txtfile."burgers.txt"
$linessarray = array();
$linesarray[$f] = count($filearray[$f]);  //number of lines in each file (to be           displayed on different lines)
$namesarray = array();
$namesarray[$f] = pathinfo($files[$f]);  //get name of file without extension(.txt) 
${'array'.$f} = explode("\n", file_get_contents("txtfiles/".$files[$f]));

?>
</head>

<body>
<?php

echo'<table align="center">
    <tr>
    <th colspan = "3">'.$namesarray[$f]['filename'].'</th>
</tr>';
//filename without ".txt"
for ($i=0; $i<$linesarray[$f]; $i++) { //loop through each text file

$part = explode(',', ${'array'.$f}[$i]);//split each line in text file by comma example       (cheeseburger, large, €3.00, made from finest beef)
  echo'<tr>

        <td id="name">'.$part[0].'</td>

        <td id="size">'.$part[1].'</td> 

        <td id="price">'.$part[2].'</td>    

 </tr>
 <tr>
        <td id="desc" colspan="3">'.$part[3].'</td> 
 </tr>';
}}

&GT?;

上面的代码可以一个接一个地打印表格。我的问题是我需要让它变得动态。作业需要只使用一个屏幕,因为它是一个显示菜单。它需要是动态的,如果字体是一定的大小我只想要一个页面上的10个项目。第一页1-10项,第二页11-20项等 大小计算没有问题,但从我的代码可以看出我循环遍历文本文件。我需要在一定数量的项目后进行分页或类似。例如,如果我在第一个txt文件中有6个项目而在第二个文件中有8个项目,那么我需要在第二个文件中分页4个项目。

我能想到的唯一方法是使用foreach merge_recursive循环,例如这个

$newArray = array_merge_recursive($array0, $array1, $array2); //merge burgers.txt with chicken.txt, etc

foreach ($newArray as $key => $value) {
      echo "$key - $value <br />"; 
}

这将合并数组并为所有这些数据分配一个键,允许我在$ newArray中说出10个项目之后进行分页。问题是我不知道我将读取多少文本文件,所以我不能像上面那样硬编码。有没有办法通过某种循环合并我的所有数组,其中一个数组被添加到之前的数组?

正如我所说,我是初学者,我几乎没有任何帮助,所以任何帮助都会受到赞赏。我知道上面的代码也很差,所以建议更好的方法可能也会有所帮助。为冗长的问题道歉。放轻松我。

2 个答案:

答案 0 :(得分:1)

您可以合并所有数组,即:

$allData = array();
for($f=0;$f<$numfiles;$f++)
{
    $filearray = array();
    $filearray[$f] = file("txtfiles/".$files[$f]);  //txtfile."burgers.txt"
    $linessarray = array();
    $linesarray[$f] = count($filearray[$f]);  //number of lines in each file (to be           displayed on different lines)
    $namesarray = array();
    $namesarray[$f] = pathinfo($files[$f]);  //get name of file without extension(.txt) 
    $allData = array_merge($allData, explode("\n", file_get_contents("txtfiles/".$files[$f])));
}

在下一步中,您可以将$ allData数组分块为

foreach (array_chunk($allData, 10) as $chunk) {
    foreach($chunk as $singlePosition) {
     //echo
    }
    echo 'separator';
} 

答案 1 :(得分:0)

感谢您的帮助。你的信息非常有用。但是,在使用这种方法时,如果我在第一个文本文件中说了15行,它将在第10行之后和第15行之后再次分开,在15(16-25)之后开始下一个块。理想情况下,无论文本文件的大小如何,我都需要它来显示0-10,10-20,20-30行。换句话说,能够在同一块10中显示多个文本文件的内容。也许我错过了一些明显的东西,但我无法弄清楚如何修复它。这是我的代码,我使用div来分隔块

<?php

$dir = 'C:\xampp\htdocs\posplus\txtfiles';
$dh  = opendir($dir);
while (false !== ($filename = readdir($dh))) {
  $files[] = $filename;//array of files
}
$dot = array_shift($files);
$dotdot = array_shift($files);

$numfiles = count($files);//counts number of text files
for($f=0;$f<$numfiles;$f++)
{
$filearray = array();
$filearray[$f] = file("txtfiles/".$files[$f]);
$numlinesarray = array();
$numlinesarray[$f] = count($filearray[$f]);//number of lines in each file (to be displayed on     different lines)

$namesarray = array();
$namesarray[$f] = pathinfo($files[$f]);//get name of file without extension(.txt) 
$allData = array();
$allData = array_merge($allData, explode("\n", file_get_contents("txtfiles/".$files[$f]))); 
?>
</head>

<body>
<div id = "container">

<?php
foreach (array_chunk($allData, 21) as $chunk) {

echo'<div class ="col1"><table align="center">
<tr>
    <th colspan = "3">'.$namesarray[$f]['filename'].'</th>
</tr>';
foreach($chunk as $singlePosition) {


    $part = explode(',', $singlePosition);

    echo'<tr>
             <td id="name">'.$part[0].'</td>
             <td id="size">'.$part[1].'</td>    
             <td id="price">'.$part[2].'</td>   

         </tr>';
}
echo '</table></div>';

   }    
} 
?>
</div>