我有一个我必须阅读的文本文件,并使用来自。
的数据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
答案 0 :(得分:2)
添加了两种输出类型的代码 - 忽略并包含不具有名称 - 值对的行。在下面查看它们
<小时/> 此代码遍历每一行,只获得同时具有name
和value
(something[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;祝你好运; - )