0

我正在创建一个函数,它读取制表符分隔的文本文件,然后将值存储在二维数组中。文本文件有一行数据,然后一行只有制表符(因为它是从 excel 导出的),我选择使用制表符而不是逗号,因为某些值中有逗号。

我打开文件进行阅读,然后使用
$lines = file($filename);

将文件的每一行作为一个元素放入数组中。

然后我使用这个 foreach 循环,如果它是所有选项卡的一行,我想取消它,如果它有数据,我想将它分解(以创建二维数组)。

这是我当前的代码:

//loop through array to either explode into two dimentional array or to unset lines with only tabs(no letters)
foreach($lines as $index => $line)
{
    //work around so that it removes any lines with 2 tabs at the begining of the line, we know this because MRN and Patient Name is always included
    if (preg_match("/^\t{2}/", $line))
    {
        unset($lines[$index]);
        echo " unset";
    }
    else
    {
        $lines[$index] = explode("\t",$line);
        echo " explode";
    }

}
//use array_values() so that indexes are in standard form in array
$lines = array_values($lines);

echo "<pre>START";
print_r($lines);
echo "END</pre>";

这是输入:

Pam Administrator   2   gold

Charlotte   Office Organizer    3   purple

这是输出:

unset explode unset explode explode

STARTArray
(
    [0] => Array
        (
            [0] => Pam
            [1] => Administrator
            [2] => 2
            [3] => gold

        )

    [1] => Array
        (
            [0] => Charlotte
            [1] => Office Organizer
            [2] => 3
            [3] => purple

        )

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

        )

)
END

我的问题是 preg_match 如果我这样做了:

(preg_match("/^\t{2}/", $line))

但如果我这样做不起作用:

$tabcount=2;
(preg_match("/^\t{$tabcount}/", $line))

它只是查看它并返回 false 并且不会取消设置该行。

为什么这样做?

先感谢您。

4

1 回答 1

0

$lines[$line]不是引用数组元素的正确方法。$line是价值,而不是关键。

foreach($lines as $index => $line)
{

    if (preg_match("/^\t{($columnammount-1)}\n/$", $line))
    {
        unset($lines[$index]);
        echo "unset";
    }
    else
    {
        $lines[$index] = explode("\t",$line);
        echo "explode";
    }

}

改变:

preg_match("/^\t{$tabcount}\n/", $line)

到:

preg_match("/^\t{{$tabcount}}\n/", $line)

这样做的原因是这是{$variable}变量插值语法的一部分——{}复杂数组需要它们,但普通变量也允许使用它们。所以整个表达式,包括大括号,都被变量值替换,产生一个正则表达式/^\t2/。因此,您需要在它周围包裹另一组大括号,以使它们保留用于正则表达式表示法。

您还可以使用连接:

preg_match('/^\t{' . $tabcount . '}$/', $line)
于 2013-05-06T23:08:45.653 回答