php foreach preg_match explode

时间:2013-05-06 23:04:31

标签: php foreach preg-match explode

我正在创建一个函数,该函数读取制表符分隔的文本文件,然后将值存储在二维数组中。 文本文件有一行数据,然后只有一行标签(因为它是从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并且不会取消该行。

为什么这样做?

提前谢谢你。

1 个答案:

答案 0 :(得分: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) 。因此,您需要在其周围包装另一组括号,以便为正则表达式表示法保留它们。

您也可以使用concatentation:

{{1}}