0

テキスト ファイルからデータをロードするためのユーティリティを作成しています。データファイルの構造を定義する配列に処理している辞書ファイルのコレクションがあります。はい、クラスなどを使用できますが、配列を使用すると困惑します。

私が読んで配列にロードする3つのファイルがあるとしましょう。配列を読み取ると、unset などを使用しようとしたにもかかわらず、3 番目のインスタンスに 2 番目の要素が含まれています。私は何が欠けていますか?私はphp 5.3.16を使用してcygwinを使用しています

以下はリストの例ですが、実際のリストではありません。したがって、substr ステートメントは実際のものではないため無視してください。

fname c 1 16
lname c 17 30

addr c 1 20
city c 21 30
state c 31 40
zip n 41 45

bday d 1 9
ssn c 10 18

以下のコードをロードすると、3 番目の配列には 2 番目の要素、つまり bday、ssn、state、zip が含まれます。

$cnt = 0;
while ($s = fgets($fp, 1024)) {
    $fldprops = array();
    $fldprops[0] = trim(substr($s,0,8));
    $fldprops[1] = trim(substr($s,9,1));
    $fldprops[2] = trim(substr($s,11,3));
    $fldprops[3] = trim(substr($s,15,3));
    $flds[$cnt] = $fldprops;
    $cnt++;
    unset($fldprops);
}

$fldprops = array(); のいずれかを考えていました。または unset() は配列をクリアしますが、機能していません。

更新: 障害点を間違えました。どうやら外側の配列への書き込みではなく、読み取り中です。コメントで述べたように、コードの後半で、foreach ループがあり、ここでは失敗しています。

foreach ($flds as $fldprop) {
     var_dump($fldprop);
}

ここでは、bday、ssn、state、および zip を取得します (2 番目の配列の最後の 2 つのエントリが 3 番目の配列とマージされます)。

4

2 に答える 2

1

これは私が得ている出力です:

<?php
    $flds = array();
    $cnt = 0;
    $s = "HelloWorldNiceToSeeYou";
    $fldprops = array();
    $fldprops[0] = trim(substr($s,0,8));
    $fldprops[1] = trim(substr($s,9,1));
    $fldprops[2] = trim(substr($s,11,3));
    $fldprops[3] = trim(substr($s,15,3));
    $flds[$cnt] = $fldprops;
    $cnt++;
    unset($fldprops);
    var_dump($flds, $cnt, $fldprops);
?>

出力:

<br />
<b>Notice</b>:  Undefined variable: fldprops in <b>/code/MQpnac</b> on line <b>13</b><br />
array(1) {
  [0]=>
  array(4) {
    [0]=>
    string(8) "HelloWor"
    [1]=>
    string(1) "d"
    [2]=>
    string(3) "ice"
    [3]=>
    string(3) "oSe"
  }
}
int(1)
NULL

PHP Notice:  Undefined variable: fldprops in /code/MQpnac on line 13

したがって、PHPはそれを正しく行っています。ライブでチェックアウト: http://codepad.viper-7.com/MQpnac

于 2012-10-05T15:19:06.653 に答える
0

なぜ一時変数を気にするのでしょうか?

$cnt = 0;
while ($s = fgets($fp, 1024)) {
    $flds[$cnt] = array(
        trim(substr($s,0,8)), 
        trim(substr($s,9,1)), 
        trim(substr($s,11,3)), 
        trim(substr($s,15,3)), 
    )
    $cnt++;
}
于 2012-10-05T15:27:40.697 に答える