首页 > 解决方案 > PHP - 数组在 N 次循环后注入位置

问题描述

我在这里处理一个奇怪的问题。我有一个for循环,它遍历由用户先前输入的具有以下预设的各种文本行组成的数组:

Name

Data1 of Name1

Data2 of Name1(这继续DataN of NameX因为数据是用户选择的一系列属性[即:11 列最多需要Name + Data10])

无论如何,一切都很顺利,直到,至少在我的测试数据集上,在循环 400 附近,数组输出显示我

Name

空白

Data1 of Name

空白

Data2 of Name

当我测试有问题的用户输入时,删除它们之前的每一个,然后将它们粘贴为唯一的输入,即:复制名称和数据 400 和 401 并粘贴为名称和数据 0 和 1,没有发现问题,尽管大约 100循环之后,Name100 Data1以下似乎遇到了同样的问题。

TL;DR - PHP 似乎在 N 次循环后在我的数组上注入空白位置,并且它似乎在几百次循环后随机但稳定地发生。任何人都可以启发我吗?非常感谢。

PS - 我已经仔细检查了数据集,并且它们出现的地方没有空格。

for($i = 0; $i < count($statisticsinput); $i++){
      if(strpos($statisticsinput[$i], "Total") !== false){
        if($step !== 2){
          $step++;
          for($k = $i; $k < $i+2*$_POST['columno']; $k++){
            unset($statisticsinput[$k]);
          }
          $statisticsinput = array_values($statisticsinput);
        }else{
          goto firststepended; //Please don't complain about the GOTO it really was needed.
        }
      }
      if($i % $_POST['columno'] == 0){
        $j++;
      }
      $employees[$j][] = $statisticsinput[$i];
    }
    firststepended:

编辑:HtmHell 要求的示例输入:

Name1



14 000

8 133

70 000

104 760

20 952

0

0

7 543 

10 476 

1º

Name2



9 000

4 796

45 000

34 177

6 835

-3 323

-15 823

0 

3 370 

2º

这几乎只是重复了不同的值。空白出现时没有确切的值,它们只是在几百个周期后出现。如果下一行不是字母顺序,则以删除所有空格的方式处理字符串。它们位于下一行不是按字母顺序排列的位置,因此如果它们在粘贴的文本中,它们应该被删除。但是粘贴时它们不存在。

标签: phploopsdebuggingfor-loopwhitespace

解决方案


您将字符串分解为数组的代码行是:

$statisticsinput = preg_split('/\r\n|\r|\n/', $_POST['statistics']);

每次在字符串\r\nor \ror中找到时都会将数组分开\n。由于您的字符串中有多个连续换行符,因此它显然会生成空数组单元格。所以首先我们要去掉多个换行符,然后才把它分解成数组。

$statisticsinput = preg_replace('#\R+#', "\n", $_POST['statistics']); 
$statisticsinput = explode("\n", $statisticsinput);

这样你就不会有空的数组单元格。

注意:\R匹配\n,\r\r\n.


推荐阅读