0

私はphpが1つの大きな多次元配列に変換する必要があるcsvファイルのリストを持っています。たった2つのphpでテストすると、2番目の変換を行うときに最大実行時間を超えます。

csv から数値多次元配列への最初の変換

2番目の変換は、数値多次元配列から文字列および数値多次元配列への変換であり、phpがエラーを生成する場所です。

私のコードは次のとおりです。

function parse($data) {
    $i = 0;
    while (isset($data[$i])) {
      $row = 0;
      while (isset($data[$i][$row])) {
        switch ($row) {
          case 0:
            //General Item details
            $fOv = 0;
            while (isset($data[$i][$row][$fOv])) {
              $array['Item'][$i][$data[$i][row][$fOv]] = $data[$i][$row + 1][$fOv];
              $fOv++; // THIS IS THE PLACE OF THE ERROR
            }
            break;
          case 2:
            //General Transaction details
            $fOv = 0;
            while (isset($data[$i][$row][$fOv])) {
              $array['Transaction'][$i][$data[$i][$row][$fOv]] = $data[$i][$row + 1][$fOv];
              $fOv++;
            }
            break;
          case 4:
            //Buyer details
            $fOv = 0;
            while (isset($data[$i][$row][$fOv])) {
              $array['Transaction']['Buyer'][$i][$data[$i][$row][$fOv]] = $data[$i][$row + 1][$fOv];
              $fOv++;
            }
            break;
          case 6:
            //Shipping details
            $fOv = 0;
            while (isset($data[$i][$row][$fOv])) {
              $array['Transaction']['Shipping'][$i][$data[$i][$row][$fOv]] = $data[$i][$row + 1][$fOv];
              $fOv++;
            }
            break;
          case 8:
            //Status details
            $fOv = 0;
            while (isset($data[$i][$row][$fOv])) {
              $array['Transaction']['Status'][$i][$data[$i][$row][$fOv]] = $data[$i][$row + 1][$fOv];
              $fOv++;
            }
            break;
        }
      $row + 2;
      }
      $i++;
    }
    return $array;
  }

数値配列は次のようになります。

array (
  0 => array (
    0 => array (
      0 => 'field 1', 1 => 'field 2', 2 => 'field 3' //continues to field 17
    )
    1 => array (
      0 => 'value 1', 1 => 'value 2', 2 => 'value 3' //continues to value 17
      //these values are for the fields in array[0][0]
    )
    2 => array ( //same as array[0][0] )
    3 => array ( //same as array[0][1], values for array[0][2] )
    4 => array ( //same as array[0][0] )
    5 => array ( //same as array[0][1], values for array[0][4] )
    6 => array ( //same as array[0][0] )
    7 => array ( //same as array[0][1], values for array[0][6] )
    8 => array ( //same as array[0][0] )
    9 => array ( //same as array[0][1], values for array[0][8] )
  )
  1 => array (
    //same structure as array[0], different details
  )
)

文字列と数値配列に対して取得しようとしているもの:

array (
  0 => array (
    'Item' => array (
      0 => array ( 
        'field 1' => 'value 1'
        'field 2' => 'value 2'
        //continues to field 17
      )
    )
    'Transaction' => array (
       0 => array (
        'field n' => 'value n' //repeated until field 17
        'Buyer' => array (
          //same as above in array[0]['Item'][0]
        )
        'Shipping' => array (
          //same as above in array[0]['Item'][0]
        )
        'Status' => array (
          //same as above in array[0]['Item'][0]
        )
      )
    )
  )
  1 => array (
    //same structure as array[0], different values
  )
)

事前に感謝します。

編集: 最大実行時間を増やしたくありません。スクリプトは、最初に csv ファイルにデータを保存する作業スクリプトと同じように、30 秒未満で完了する必要があります。

4

2 に答える 2

2

迅速で汚いアプローチ:

ini_set('max_execution_time', 0);

スクリプトが無限ループに入った場合、スクリプトが終了することはないことに注意してください:)時間制限を削除するとメモリ制限に達する可能性が高いため、コマンドラインから次のコマンドラインを使用してこれを実行するとよいでしょう。 apacheのクラッシュを避けてください。

編集: $ iiiのような変数名を使用しないようにコードを変更してみてください。これは、非常に読みにくいためです。これだけで解決策が明らかになることがわかるかもしれません。

編集: $ row + 2; $ row +=2である必要があります。

于 2012-05-21T11:54:20.550 に答える
0

またはphp.iniファイル内:

max_execution_time = 0

于 2012-05-21T11:57:18.303 に答える