PHP-Data txt - 二维数组 - 每条记录的数据分组

时间:2017-03-07 13:46:19

标签: php arrays multidimensional-array concatenation

我需要读取,排列对齐并按(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>";
}

2 个答案:

答案 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