首页 文章

php foreach preg_match explode

提问于
浏览
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并且不会取消该行 .

为什么这样做?

先感谢您 .

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/ . 所以你需要在它周围包装另一组括号,以便为正则表达式表示法保留它们 .

    你也可以使用concatentation:

    preg_match('/^\t{' . $tabcount . '}$/', $line)
    

相关问题