首页 > 解决方案 > PHP如何摆脱多行字符串声明中的换行符,EOD方法不起作用

问题描述

在 PHP 中,我有 2 个来自外部源的字符串,每个字符串包含 32x32 1 或 0。因为这是一项要求,所以我需要将其格式化为 32x32,因为这些位中的每一位都代表一帧中的一个像素。

我面临的问题是,我需要对这些 1 或 0 中的每一个并行执行按位逻辑,因为一个会影响另一个。在 PHP 中,据我所知,我唯一的选择是将它们变成一个数组,其中每个位都是 1 个索引,方法是在每个位之后添加逗号,然后将其分解为一个数组。(但 ofc 可以随时证明我错了 :))但是,当我尝试分解字符串时,换行符会包含在由分解创建的数组中的每个第 32 位(行的最后一位)位上。

我试过 $image = <<<EOD ... EOD; 绕过它的方法,但它不是bueno。我的问题是,是否有一种巧妙的方法可以在两个图像上同时逐位访问每一位数据,以便我可以做一些按位数学?

我目前的 EOD 方法:($image1 和 $image2 格式相同,我只粘贴在 image 1 声明中)。

$image1 = <<<EOD
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
    EOD;

然后爆炸:

$image_array = explode(',', $image1);

创建此输出(取出部分,因此我不需要在此处列出所有 1024 位,但重点是,每个第 32 位末尾都有一个换行符)。

    [33] => 0
    [34] => 0
    [35] => 0
    [36] => 0
    [37] => 0
    [38] => 0
    [39] => 0
    [40] => 0
    [41] => 0
    [42] => 0
    [43] => 0
    [44] => 0
    [45] => 0
    [46] => 0
    [47] => 0
    [48] => 0
    [49] => 0
    [50] => 0
    [51] => 0
    [52] => 0
    [53] => 0
    [54] => 0
    [55] => 0
    [56] => 0
    [57] => 0
    [58] => 0
    [59] => 0
    [60] => 0
    [61] => 0
    [62] => 0
    [63] => 0
    [64] =>
0

另外,作为一个额外的问题:在我的用例中,是否有一个更好的解决方案,我不需要在声明的每一位之后插入逗号?如果有,那就太棒了。先谢谢各位大佬了,期待你们的解答。:)

标签: phpstringdeclarationmultiline

解决方案


我会说输入格式实际上是有问题的。如果它是用来描述一个 32*32 的矩阵,那么那些尾随的逗号没有任何意义。

但是,如果您无法解决该问题,则只需实现一个原始解析器即可满足您的需求:

<?php
$input = <<<EOD
0,0,0,
0,1,1,
1,0,0
EOD;

$output = [];
foreach (explode("\n", $input) as $y => $line) {
  $output[$y] = [];
  foreach(explode(",", $line) as $x => $cell) {
    if ($cell != "") {
      $output[$y][$x] = $cell; 
    }
  }
}

print_r($output);

输出显然是:

Array
(
    [0] => Array
        (
            [0] => 0
            [1] => 0
            [2] => 0
        )
    [1] => Array
        (
            [0] => 0
            [1] => 1
            [2] => 1
        )
    [2] => Array
        (
            [0] => 1
            [1] => 0
            [2] => 0
        )
)

当然存在其他方法,但没有一种比另一种更好,除非你能说出一个原因......


推荐阅读