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“像一百万次。那么最好看看这个文件。听起来它不像你想象的那样。代码中没有任何东西会导致无限循环,但是如果文件在更远的地方有不同的结构,那么它看起来就像冻结了一样。