php在foreach之后返回一个空数组

时间:2012-07-20 07:12:37

标签: php arrays foreach file-get-contents

我可以避免由foreach生成的空数组吗? 这是我的代码

$file="test.txt";
$open = file_get_contents($file);
$lines = explode(PHP_EOL, $open);
foreach($lines as $line){
    $domain = preg_split('/\s+/', $line,-1,PREG_SPLIT_NO_EMPTY);
    echo "<pre>";
    var_dump($domain);
    echo "$domain[0] OK";
    echo "</pre>";
}

test.txt包含此

www.google.com  2.2.2.3
www.test.com    2.2.2.3
www.example.com 2.2.2.3

我运行脚本后,结果就是这个

array(2) {
  [0]=>
  string(14) "www.google.com"
  [1]=>
  string(7) "2.2.2.3"
}
www.google.com OK
array(2) {
  [0]=>
  string(12) "www.test.com"
  [1]=>
  string(7) "2.2.2.3"
}
www.test.com OK
array(2) {
  [0]=>
  string(15) "www.example.com"
  [1]=>
  string(7) "2.2.2.3"
}
www.example.com OK
array(0) {
}
 OK

导致array(0)出现的原因是什么? www.example.com或其他元素之后没有新行 我可以删除它,或者只是不生成它吗?

5 个答案:

答案 0 :(得分:2)

在最后一个域之后有一个额外的换行符或其他空白字符。

首先修剪文本文件内容:

$open = trim(file_get_contents($file));

您还可以检查循环中的行是否为空。

$file="test.txt";
$open = trim(file_get_contents($file));  // Either this..
$lines = explode(PHP_EOL, $open);
foreach($lines as $line){

    if ($line === '') // Or this
        continue;


    $domain = preg_split('/\s+/', $line,-1,PREG_SPLIT_NO_EMPTY);
    echo "<pre>";
    var_dump($domain);
    echo "$domain[0] OK";
    echo "</pre>";
}

答案 1 :(得分:0)

检查包含最后一行的内容:

var_dump($line);

如果它包含空字符串,只需添加一些检查:

if ( empty($line) ) {
  continue;
}

答案 2 :(得分:0)

最好使用preg_match_all作为示例:

只是名字

<?php
$file = 'test.txt';
$open = file_get_contents($file);
preg_match_all('/^\S+/m', $open, $matches);
print_r($matches[0]);
Array
(
    [0] => www.google.com
    [1] => www.test.com
    [2] => www.example.com
)

姓名和号码

<?php
$file = 'test.txt';
$open = file_get_contents($file);
preg_match_all('/^(\S+)\s+(\S+)$/m', $open, $matches);
print_r($matches);
Array
(
    [0] => Array
        (
            [0] => www.google.com  2.2.2.3
            [1] => www.test.com    2.2.2.3
            [2] => www.example.com 2.2.2.3
        )

    [1] => Array
        (
            [0] => www.google.com
            [1] => www.test.com
            [2] => www.example.com
        )

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

)

$result = array_combine($matches[1], $matches[2]);
print_r($result);
Array
(
    [www.google.com] => 2.2.2.3
    [www.test.com] => 2.2.2.3
    [www.example.com] => 2.2.2.3
)

答案 3 :(得分:0)

我建议你改用SplFileObject

$path = "test.txt";
$file = new SplFileObject($path);

$file->setFlags(
    SplFileObject::DROP_NEW_LINE   # new line characters at the end of line
    | SplFileObject::SKIP_EMPTY    # skip empty lines, e.g. the one at the end
);

foreach ($file as $line)
{
    $domain = preg_split('/\s+/', $line, -1, PREG_SPLIT_NO_EMPTY);

    echo "<pre>", var_dump($domain), "$domain[0] OK", "</pre>";
}

它不仅支持你的问题内置(参见标志),而且还逐行解析文件,因此对于较大的文件,它不会完全转移到内存中。另请参阅file函数。

答案 4 :(得分:0)

我已经测试了您的代码,发现它运行良好...... 我用相同的代码得到了这个输出

  array(2) {
  [0]=>
  string(14) "www.google.com"
  [1]=>
  string(7) "2.2.2.3"
}
www.google.com OK

array(2) {
  [0]=>
  string(12) "www.test.com"
  [1]=>
  string(7) "2.2.2.3"
}
www.test.com OK

array(2) {
  [0]=>
  string(15) "www.example.com"
  [1]=>
  string(7) "2.2.2.3"
}
www.example.com OK 

我认为你的文本文件中有新行[enter]请使用退格键删除它,它会正常工作..