【问题标题】:How to merge an unknown number of arrays如何合并未知数量的数组
【发布时间】:2013-10-22 15:43:03
【问题描述】:

我是 php 新手,经过研究,我没有找到我理解的答案。我正在使用带有 html 的 php。我正在从文本文件(file_get_contents)中读取。我正在做一个餐厅菜单,其中第一项是“汉堡”(burgers.txt)。其次是“鸡”等。我使用爆炸功能分离这些文本文件。这是我的代码

<?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>';
}}

?>

上面的代码一个接一个地打印表格。我的问题是我需要让它动态化。这项工作只需要使用一屏,因为它是一个显示菜单。它需要是动态的,如果字体是特定大小,我只希望页面上有 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 个项目之后进行分页。问题是我不知道要读取多少文本文件,所以我不能像上面那样对其进行硬编码。有没有一种方法可以通过某种循环合并我的所有数组,其中一个数组被添加到之前的数组中?

正如我所说,我是一名初学者,几乎没有任何帮助,因此我们将不胜感激。我知道上面的代码也很差,所以建议更好的方法也可能会有所帮助。为冗长的问题道歉。对我放轻松。

【问题讨论】:

    标签: php html arrays


    【解决方案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';
    } 
    

    【讨论】:

      【解决方案2】:

      感谢您的帮助。你的信息很有帮助。但是,在使用这种方法时,如果我在第一个文本文件中说 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>
      

      【讨论】:

      • 我已经修改了上面的代码。我认为这种方法行不通。如果我在第一个文本文件中有 24 行,则 div 1 将有 21 行,div 2 将有 24 (3 + 21)。理想情况下,我想要 (3 + 18),以便它们适合我的屏幕。此数组合并不会将数组完全合并到一个数组中,而是将一个数组合并到另一个数组上(如果有意义的话)。无论它们来自哪个文本文件,我都需要它们显示 21 个块。
      • 你在第一个 for 循环中重置 $allData 数组 ($allData = array(); $allData = array_merge($allData, explode("\n", file_get_contents("txtfiles/".$files[ $f])));)。你应该在循环之前这样做!
      • 再次感谢您的帮助。当我需要 "$f" 来获取内容时,如何将它放在循环之外。我可以结束 for 循环并开始另一个循环,但我遇到了更多问题。我可能错过了一些简单的东西,所以请原谅我的无知。
      • 只移动一行 $allData=array();以上循环
      • 好的,你有一个包含 24 行的文件和第二个包含多少行的文件?你期待什么输出?
      猜你喜欢
      • 2021-12-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      相关资源
      最近更新 更多