如何在PHP中删除多行文本文件中的多个空格

如何在PHP中删除多行文本文件中的多个空格,php,multidimensional-array,removing-whitespace,Php,Multidimensional Array,Removing Whitespace,我有一个文本文件,其中包含由“\n”分隔的行以及每个项目之间的空格。项目由一个或多个空格分隔。然而,元素之间的空白间隔在每行中是一致的。 FRUIT WATER GRE LRG 0003 050 FRUIT BANAN YEL MED 0017 010 FRUIT STRAW RED SML 0005 005 FRUIT LEMON YEL SML 0024 005 VEGIE REDPE RED MED 0008 001 V

我有一个文本文件,其中包含由“\n”分隔的行以及每个项目之间的空格。项目由一个或多个空格分隔。然而,元素之间的空白间隔在每行中是一致的。

FRUIT   WATER   GRE  LRG   0003 050
FRUIT   BANAN   YEL  MED   0017 010
FRUIT   STRAW   RED  SML   0005 005
FRUIT   LEMON   YEL  SML   0024 005
VEGIE   REDPE   RED  MED   0008 001
VEGIE   GRENP   GRE  MED   0009 001
BOX   RED     006 012 018
BOX   YEL     010 020 030
BOX   GRE     003 006 009
PERSON      JOHN  TALL  STRG
PERSON      JIMM  MEDM  WEAK
PERSON      DAVD  MEDM  STRG
我正在尝试用PHP解析这个文件。下面的代码生成一个包含许多空格的数组

if(file_exists($filename)) {
        $filecontents = file_get_contents($filename);
        $lines = explode("\n", $filecontents);
        foreach ($lines as $line) {
        $exploded = explode(" ", $line);
        if (sizeof($exploded) >= 5 and $exploded[0] == 'FRUIT') $array[] = array(
            'type' => $exploded[1],
            'color' => $exploded[2],
            'size' => $exploded[3],
            'qty' => $exploded[4],
            'weight' => $exploded[5]
            );
        if (sizeof($exploded) >=5 and $exploded[0] == 'VEGIE') $array[] = array(
            'type' => $exploded[1],
            'color' => $exploded[2],
            'size' => $exploded[3],
            'qty' => $exploded[4],
            'weight' => $exploded[5]
            );
        if (sizeof($exploded) >= 5 and $exploded[0] == 'BOX') $array[] = array(
            'color' => $exploded [1],
            'largefit' => $exploded[2],
            'medfit' => $exploded[3],
            'smallfit' => $exploded[4]
            );
        if (sizeof($exploded) >= 4 and $exploded[0] == 'PERSON') $array[] = array (
            'name' => $exploded[1],
            'build'=> $exploded[2],
            'strength' => $exploded[3]
            );
        }
    }

print_r($array);

?>

简单的答案是,在保存所有值之前,对其使用
trim()

'type' => trim($exploded[1]),
但是,这项工作你可以更有效地完成。还要注意,该命令会自动将文件读入数组

<?php
if(file_exists($filename)) {
    $array = [];
    $lines = file($filename);
    foreach ($lines as $line) {
        if (!preg_match("/(\w+)\s+(\w+)\s+(\w+)\s+(\w+)(?:(?:\s+(\w+))?\s+(\w+))?/", $line, $matches)) {
            continue;
        }
        switch ($matches[1]) {
            case "FRUIT":
            case "VEGGIE":
                list($foo, $bar, $type, $color, $size, $qty, $weight) = $matches;
                $array[] = compact("type", "color", "size", "qty", "weight");
                break;
            case "BOX":
                list($foo, $bar, $color, $largefit, $medfit, $smallfit) = $matches;
                $array[] = compact("color", "largefit", "medfit", "smallfit");
                break;
            case "PERSON":
                list($foo, $bar, $name, $build, $strength) = $matches;
                $array[] = compact("name", "build", "strength");
                break;
        }
    }
}
print_r($array);

不清楚你在问什么。要替换多个空格,您可以执行以下操作:
$var=preg\u replace('/++','''.$var)
或任何空格字符
$var=preg\u replace('/\s++',''.$var)
谢谢,我今晚将尝试此操作。您确定这不仅仅是每个字段之间的一个选项卡吗?我使用一个编辑器查看了文本文件,该编辑器可以识别不同于选项卡的空格。在本例中,它将分隔显示为空格。当我在实际想要处理的文件(~40MB)上尝试此代码时,我得到一个内存错误。有办法解决这个问题吗?您可以使用
fopen()
fread()
fclose()
来访问该文件。与其一次加载整个文件,不如一行一行地读取。然后将
foreach
循环替换为
while(!feof($fp))
循环。