0

によって生成される空の配列を回避できます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 またはその他の要素の後に改行はありません。
削除することはできますか、それとも単に生成しないようにすることはできますか?

4

5 に答える 5

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>";
}
于 2012-07-20T07:14:55.567 に答える
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
)
于 2012-07-20T07:19:44.360 に答える
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>";
}

問題のビルドをサポートするだけでなく (フラグを参照)、ファイルを 1 行ずつ解析するため、大きなファイルの場合、完全にメモリにシフトすることはありません。関数も参照してくださいfile

于 2012-07-20T07:23:14.203 に答える
0

次のコマンドを使用して、最後の行に何が含まれているかを確認します。

var_dump($line);

空の文字列が含まれている場合は、チェックを追加してください:

if ( empty($line) ) {
  continue;
}
于 2012-07-20T07:15:51.410 に答える
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] があると思います。バックスペースを使用して削除してください。正常に動作します。

于 2012-07-20T07:43:23.300 に答える