php从输入文件中选择特定内容以放入数组元素
我有一个输入文件(如下所示的文件),其中有多行,我需要从中选择特定的文本,并将每个选择放入数组元素中: 从输入文件:php从输入文件中选择特定内容以放入数组元素,php,input,multidimensional-array,text-parsing,Php,Input,Multidimensional Array,Text Parsing,我有一个输入文件(如下所示的文件),其中有多行,我需要从中选择特定的文本,并将每个选择放入数组元素中: 从输入文件: "BLOCK","PARTNO" "ELEMENT","HEADER-" "NAME","1AB000072186" "REVISION","0000" "PARTSHAPE","RECT_074_044_030" "PACKAGE","120830E" "PMABAR","" "PARTCOMMENT","CAP-TANT*150uF*20%*10V7343*4.
"BLOCK","PARTNO"
"ELEMENT","HEADER-"
"NAME","1AB000072186"
"REVISION","0000"
"PARTSHAPE","RECT_074_044_030"
"PACKAGE","120830E"
"PMABAR",""
"PARTCOMMENT","CAP-TANT*150uF*20%*10V7343*4.3mm"
"ELEMENT","PRTIDDT-"
"PMAPP",1
"PMADC",2
"ComponentQty",2
"BLOCK","PARTNO"
"ELEMENT","HEADER-"
"NAME","1AB030430005"
"REVISION","0000"
"PARTSHAPE","RECT_072_042_030"
"PACKAGE","120830E"
"PMABAR",""
"PARTCOMMENT","1.0000 Amp SUBMINIATURE FUSE"
"ELEMENT","PRTIDDT-"
"PMAPP",2
"PMADC",0
"ComponentQty",1
"BLOCK","PARTNO"
"ELEMENT","HEADER-"
"NAME","1AB030430001"
"REVISION","0000"
"PARTSHAPE","RECT_072_042_030"
"PACKAGE","120830E"
"PMABAR",""
"PARTCOMMENT","2.0000 Amp SUBMINIATURE FUSE"
"ELEMENT","PRTIDDT-"
"PMAPP",2
"PMADC",0
"ComponentQty",1
请注意,每次出现带有短语“ComponentQty”的行后,内容开始重复
其中,我需要数组元素一维中出现“NAME”旁边的零件号,以及每个元素在第二维中出现“PARTSHAPE”旁边的内容。我很困惑如何做到这一点虽然…请帮助
$fh = fopen('yourfile.txt', 'rb');
$found_stuff = array();
$last_component = null;
while($line = fgets($fh)) { // read a line
$parts = explode(',', $line); // split into components
switch($parts[0]) { // based on which key we're on
case '"NAME"':
$last_component = $parts[1]; // save the key's value
break;
case '"PARTSHAPE"':
$found_stuff[$last_component] = $parts[1]; // store the partshape name
break;
}
}
fclose($fh);
这应该是基础工作。读一行,在逗号处把它分解成几段。第一部分是“关键”,第二部分是价值。然后继续阅读,直到我们找到一个名称或零件形状键,然后根据需要存储这些值
请注意,我没有从值中去掉双引号。这是留给读者的练习。此代码还假设文件的格式是规则的,并且“名称”将显示在任何零件形状行之前,并且名称/零件形状行之间将有一个完美的1:1交替。如果您连续获得两个零件形状,您将丢失第一个零件形状。如果一个零件形状在遇到名字之前出现,你也会失去它。以下步骤对我很有效: 粘贴在我的OP中的部分(重复多次)定义为
$PartNoContents
$BlockData[]
是我需要将$PartNoContents中的选择粘贴到的数组
$PartNoContents = str_replace('"', '', $PartNoContents);
$PartLines = explode("\n", $PartNoContents);
$PartData = array();
foreach ($PartLines as $PartLine){
$PartData[] = explode(',', $PartLine);
}
for($p=0;$p<count($PartLines);$p++){
if ( isset( $PartData[$p][1] ) && !empty( $PartData[$p][1] ) ){
$p1 = str_replace(chr(13), '', $PartData[$p][1]);
if ( isset($BlockData[$b][0]) && !empty($BlockData[$b][0]) && $BlockData[$b][7]==$p1 ){
$BlockData[$b][13] = str_replace(chr(13), '', $PartData[$p+$PartDataIncNum][1]);
$p = count($PartLines) ;
}
}
}
$PartNoContents=str_replace(“,”$PartNoContents);
$PartLines=explode(“\n”,$PartNoContents);
$PartData=array();
foreach($PartLine作为$PartLine){
$PartData[]=分解(“,”,$PartLine);
}
对于($p=0;$p),在我添加代码并尝试执行shell后,shell只是挂起,没有显示任何类似于其仍在处理的内容。奇怪。可能会让它在运行时吐出一些调试信息,例如找到的名称/零件形状。我在switch语句的右括号后放置了一个echo$parts[0],它会以“0”作为响应UnitUnitUnit“像一百万次。那么最好看看这个文件。听起来它不像你想象的那样。代码中没有任何东西会导致无限循环,但是如果文件在更远的地方有不同的结构,那么它看起来就像冻结了一样。