我需要读取,排列对齐并按(Cd)
分组,这是每条记录的唯一索引。因此,(Cd)
引用每个新记录,其中可能包含多个子组:(11)
,(22)
,(Co)
等。这些子组可能包含一个额外的行(请参阅第一个记录中(Co)
的示例,它应该连接包含“for cabinet”和“for closet。”的行。)。
我的TXT文件结构是:inventory.txt
>No. 0012 of 01/31/2016
>No. 0012 of 01/31/2016
>(Cd) 12345
>(11) Cod1-023
>(22) 22/12/1945
>(Co) locking doors
>For cabinet
>For closet.
>(Cd) 23456
>(11) Cod1-055
>(21) 01/01/2005
>(22) drawer iron
>,wood
>,aluminum
>(Cd) 78920
>(22) Cod1-077
>(54) 2/22/1975
>(Co) clip Aluminum or iron
>(74) anodized
>(Cd) 0002525
>(Di) Cod4-07100
>(11) 02/22/2017
>(22) shirt Red green
>(54) yellow buttons
>(Co) mango
>,avocado
>,cherry
我实施了以下例程,但经过大量研究和修改后,我无法对子指数进行分组:
在一起,我需要一个例程来将数据从数组传输到变量,然后传输到mysql数据库。
如果有人可以给我一个灯,谢谢。
$cd = [];
$group = [];
$counter = 0;
$file = fopen ('inventory.txt', 'r');
while (! feof ($file)) {
$row = trim (fgets ($file, 1024));
// $row = trim ($row);
if (substr ($row, 0, 4) == '(cd)') {
$counter = 0;
if (! empty ($group)) {
$cd [$id] = $group;
$group = [];
$counter = 0;
}
$id = substr ($row, 5, strlen ($row) -5);
$cd [$id] [] = $line;
} else {
if (substr ($row, 0, 4)! == '(11)') {
if (isset ($group [$counter-1])) {
$group [$counter -1]. = ''. $line;
$counter--;
}
} else {
$group [] = $row;
}
$counter ++;
}
}
$cd [$id] = $group;
fclose ($file);
echo '<pre>';
print_r ($cd);
exit;
// -------------------------
// routine to transfer data from array to variables
$keys = array_keys ($cd);
for ($i = 0; $i <count ($cd); $i ++) {
echo $keys [$i]. "<br>";
foreach ($cd [$keys [$i]] as $key => $value) {
echo $key. ":". $value. "<br>";
}
echo "<br>";
}
答案 0 :(得分:0)
感谢您编辑问题以附加文件内容行。这是我的新解决方案。
这将禁止在(22)
行之后立即连接任何行。
如果(22)
之外还有其他触发器表明连接是不需要的,请修改第二个$concat
块中的elseif
条件。
$cd=[]; // declare array
$i=-1; // set outer index
$concat=true;
$file=fopen('inventory.txt','r');
while(!feof($file)){
$row=trim(fgets($file,1024));
if(preg_match('/^\(Cd\)\s(.+)/',$row,$match)){ // capture Cd numbers
++$i; // increment outer_index
$j=-1; // reset inner_index
$id=$match[1]; // store cd value
$concat=true;
}elseif(preg_match('/^(\(..\)\s.*)/',$row,$match)){ // capture Cd data
++$j; // this is a new innerarray element, increment its index
$cd[$i][$id][$j]=$match[1]; // push element into array
$concat=(strpos($match[1],'(22)')!==0?true:false);
}elseif(isset($id) && $concat){ // ignore all file header content
$cd[$i][$id][$j].=" $row"; // concatenate to last element
}
}
echo "<pre>";
var_export($cd); // display in true nested form
echo "</pre>";
foreach($cd as $outer_index=>$cdarrays){
foreach($cdarrays as $id=>$innerarrays){
foreach($innerarrays as $inner_index=>$line){
echo "$outer_index : $id : $inner_index = $line<br>"; // display keys & values by row
}
}
}
$ cd数组将具有以下结构:
array (
0 =>
array (
12345 =>
array (
0 => '(11) Cod1-023',
1 => '(22) 22/12/1945',
2 => '(Co) locking doors For cabinet For closet. ',
),
),
1 =>
array (
23456 =>
array (
0 => '(11) Cod1-055',
1 => '(21) 01/01/2005',
2 => '(22) drawer iron',
),
),
2 =>
array (
78920 =>
array (
0 => '(22) Cod1-077',
1 => '(54) 2/22/1975',
2 => '(Co) clip Aluminum or iron',
3 => '(74) anodized',
),
),
3 =>
array (
'0002525' =>
array (
0 => '(Di) Cod4-07100',
1 => '(11) 02/22/2017',
2 => '(22) shirt Red green',
3 => '(54) yellow buttons',
4 => '(Co) mango ,avocado ,cherry',
),
),
)
或者,如果您想以扁平/详细的方式查看它:
0 : 12345 : 0 = (11) Cod1-023
0 : 12345 : 1 = (22) 22/12/1945
0 : 12345 : 2 = (Co) locking doors For cabinet For closet.
1 : 23456 : 0 = (11) Cod1-055
1 : 23456 : 1 = (21) 01/01/2005
1 : 23456 : 2 = (22) drawer iron
2 : 78920 : 0 = (22) Cod1-077
2 : 78920 : 1 = (54) 2/22/1975
2 : 78920 : 2 = (Co) clip Aluminum or iron
2 : 78920 : 3 = (74) anodized
3 : 0002525 : 0 = (Di) Cod4-07100
3 : 0002525 : 1 = (11) 02/22/2017
3 : 0002525 : 2 = (22) shirt Red green
3 : 0002525 : 3 = (54) yellow buttons
3 : 0002525 : 4 = (Co) mango ,avocado ,cherry
答案 1 :(得分:0)
@mickmackusa我非常感谢你的耐心和贡献。他的代码很棒,但他正在消除他跳跃的界限(22)。因此,我修改了结构以捕获后面的值,包括在数组内的新ID中。 我的数组知识非常有限,但代码可以满足我的需求。 如果您可以为简化我建立的操作做出贡献,我很高兴知道。
为什么会出现错误“警告:未定义的偏移量:3和未定义的偏移量:5,在此行中:$ cd [$ i] [$ id] [$ j]。=”$ Row“;
year mon mday hour min sec
1: 2017 3 14 7 23 11
2: 2017 3 14 7 22 5
3: 2017 3 14 7 20 58
4: 2017 3 14 7 19 51
5: 2017 3 14 7 18 45
6: 2017 3 14 7 17 38
7: 2017 3 14 7 16 31
8: 2017 3 14 7 15 25
9: 2017 3 14 7 14 18
10: 2017 3 14 7 13 11