2012-05-21 48 views
0

我有一個csv文件的列表,我需要php來轉換爲一個大的多維數組,測試只有2個PHP超過傳輸第二次轉換時的最大執行時間。多維數組超過最大執行時間

第一轉換從CSV其事數值多維數組

第二轉換從數值多維數組對字符串和數值多維數組,這是在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 
) 
) 

任何幫助非常感謝,提前感謝。

編輯: 我不想增加最長執行時間,劇本花費時間不超過30秒,一樣的工作腳本我有存儲在首位的CSV文件中的數據。

回答

2

的快速和骯髒的方法:

ini_set('max_execution_time', 0); 

雖然要注意,如果你的腳本進入無限循環,它永遠不會結束:)更可能的是,取消時間限制將導致你打一個內存限制,所以你可以做得很好,通過命令行來避免崩潰apache。

編輯: 試着改變你的代碼,不要使用像$ iii這樣的變量名,因爲這很難讀。您可能會發現僅憑這一點就會使解決方案顯而易見。

編輯: $ row + 2; 應該是 $ row + = 2;

+0

在這種情況下,將保持腳本運行下去,因爲它能夠在第一種情況下追了上來,因爲當'情況0'執行它應該增加2到'$ ii'並轉到下一個案例。它並不會在情況0中被掛起。當最初將數據存儲在csv文件中時,它甚至不需要5秒鐘,最大執行時間不是問題,這是某處的編碼錯誤。 – CKKiller

+0

編輯它以減少混淆,但我仍然看不到錯誤。 – CKKiller

+0

$ row + 2;應該是$ row + = 2; –

0

或者在您的php.ini文件:

max_execution_time = 0

+0

與我對馬特吉布森所說的相同 – CKKiller

+0

是的,他回答我正在做別的事情時,那麼當我回答他的答案時已經在那裏:P – ionize