PHP从文本文件

时间:2016-07-15 13:13:18

标签: php input output

我有一个我必须阅读的文本文件,并使用来自。

的数据
3
sam 99912222
tom 11122222
harry 12299933
sam
edward
harry

如何以下列形式创建这些字符串的数组?

array(
    "name" => "number"
    ...
)

我试过了:

$handle = fopen("file.txt", "r");
fscanf($handle, "%d %d", $name, $number);

然后呢?无论我尝试什么,它只适用于第一行。

sam 99912222

3 个答案:

答案 0 :(得分:2)

添加了两种输出类型的代码 - 忽略并包含不具有名称 - 值对的行。在下面查看它们

<小时/> 此代码遍历每一行,只获得同时具有namevaluesomething[space]something))的代码:

//$lines = ... each line of the file in an array

$vals = array();
foreach($lines as $v){
    $tmp = explode(' ', $v);
    if(count($tmp) > 1){
        $vals[trim($tmp[0])] = trim($tmp[1]); // trim to prevent garbage
    }
}

print_r($vals);

它将输出:

Array
(
    [sam] => 99912222
    [tom] => 11122222
    [harry] => 12299933
)

请参阅操作中的代码here

如果您需要这些值,即使它们没有成对出现,也可以这样做:

//$lines = ... each line of the file

$vals = array();
foreach($lines as $v){
    $tmp = explode(' ', $v);
    $name = '';
    $number = '';
    $tmp[0] = trim($tmp[0]);
    if(count($tmp) > 1){
        $name = $tmp[0];
        $number = trim($tmp[1]);
    }else{
        if(is_numeric($tmp[0])){
            $number = $tmp[0];
        }else{
            $name = $tmp[0];
        }

    }
    $vals[] = array(
        'name' => $name,
        'number' => $number
    );
}

print_r($vals);

输出:

Array
(
    [0] => Array
        (
            [name] => 
            [number] => 3
        )

    [1] => Array
        (
            [name] => sam
            [number] => 99912222
        )

    [2] => Array
        (
            [name] => tom
            [number] => 11122222
        )

    [3] => Array
        (
            [name] => harry
            [number] => 12299933
        )

    [4] => Array
        (
            [name] => sam
            [number] => 
        )

    [5] => Array
        (
            [name] => edward
            [number] => 
        )

    [6] => Array
        (
            [name] => harry
            [number] => 
        )

请参阅操作中的代码here

答案 1 :(得分:1)

文件中的数据不一致,最好使用正则表达式来识别每行中的数据。

$lines = file('file.txt'); // this will open file and split them into lines
$items = array();
foreach($lines as $line){
   $userFound = preg_match("/([A-Za-z]+) ([0-9]+)/", $line, $matches);
   if($userFound){
      $items[$matches[1]] = $matches[2];
   }

}

然后在项目中,您应该从文件中找到已解析的数据。

要使其只提取完整格式数据,只需将带有正则表达式的行更改为一行,如下所示:

{{1}}

答案 2 :(得分:1)

使用下面的算法,您可以简单地将文本文件内容的每一行解析为一个数组,其中每行上的第一个字或数字作为键,第二个字作为值。当第二个单词或单词组不存在时,将为该键分配NULL。为了重用,该算法已封装到一个Function中。你走了:

<?php

    function parseTxtFile($txtFile){
        $arrTxtContent      = [];

        if(!file_exists($txtFile)){ return null;}
        $strFWriteTxtData   = file_get_contents($txtFile);

        if(empty($strFWriteTxtData)){return null;}

        $arrFWriteInfo      = explode("\n", $strFWriteTxtData);

        foreach($arrFWriteInfo as $iKey=>$lineData){
            $arrWriteData   = explode(", ", $lineData);
            foreach($arrWriteData as $intKey=>$strKeyInfo){
                preg_match("#(^[a-z0-9_A-Z]*)(\s)(.*$)#i", $strKeyInfo, $matches);
                preg_match("#(^[a-z0-9_A-Z]*)(\s*)?$#i", $strKeyInfo, $matches2);
                if($matches) {
                    list(, $key, $null, $val)   = $matches;
                    if (!array_key_exists($key, $arrTxtContent)) {
                        $arrTxtContent[$key]    = $val;
                    }else{
                        $iKey   = $intKey + 1;
                        $key    = $key . "_{$iKey}";
                        $arrTxtContent[$key]    = $val;
                    }
                }else if($matches2) {
                    list(, $key, $null)   = $matches2;
                    if (!array_key_exists($key, $arrTxtContent)) {
                        $arrTxtContent[$key]    = null;
                    }else{
                        $key = preg_match("#_\d+#", $key, $match)? $key . $match[0] : "{$key}_1";
                        $arrTxtContent[$key]    =  null;
                    }
                }
            }
        }
        return $arrTxtContent;
    }

    var_dump(parseTxtFile(__DIR__ . "/data.txt"));

只需调用函数parseTxtFile($txtFile),将其传递给文本文件的路径,它将返回一个如下所示的数组:

    array (size=7)
      3         => null
      'sam'     => string '99912222' (length=8)
      'tom'     => string '11122222' (length=8)
      'harry'   => string '12299933' (length=8)
      'sam_1'   => null
      'edward'  => null
      'harry_1' => null

希望这有点帮助......

干杯&amp;祝你好运; - )