2017-10-19 71 views
-1

我運行此針對一個關聯(非數字鍵)數組,它是80K線,從2.1K JSON文件解碼遞歸的foreach:加快使用PHP

$ret = array(); 

function recursive(array $array, $tableName, $level=''){ 

global $ret; 

$tableData = array(); 

    foreach($array as $key => $value){ 
     if(!is_array($key)) $k = $key; // keep array keys for tablename 

     if(is_array($value)){ 
      $key = is_int($key) ? $tableName : $key; //skip empty subarrays 
      recursive($value, $level=$key); 

     } else{ 
      $tableData=[$tableName, $k, $value]; 
     } 
     if (!empty($tableData)) 
     {array_push($ret, $tableData); 
     } 

    } 
return $ret; 
} 

$ret =(recursive($array, 'project')); 

JSON數據包含空分在'is_int($ key)遞歸循環期間被丟棄的數組。這是一個典型的文件大小,將被處理並且該函數需要花費2分鐘才能運行 - 這可能會達到最佳效果 - 但我想問一下,是否有任何方法可以通過更好的編碼來加速此功能。

謝謝你,

+0

如果您使用php:<7.0,您可以使用SplFixedArray,並且函數內部的遞歸函數永遠不會返回某些東西,因爲您不指定它 –

+0

我不認爲SplFixedArray適用 - 「SplFixedArray具有固定長度並且只允許內部的整數範圍作爲索引「。我想,因爲這些鍵是我想保留的數據的字符串,所以這是不可用的。 – startingout

回答

0

這似乎是永遠正確的:if(!is_array($key)) $k = $key;

您在不使用$level變量。你爲什麼需要它?

全局是非常糟糕的主意。你可能需要將變量發送到你的函數by link,而不是價值:

function recursive(&$data, &$result, $tableName) 
{ 
    //some of your logic here 
    //... 
    //if you need a recursion call 
    recursive($data, $result, $tableName); 
} 

//function call 
$result = []; 
recoursive($data, $result, 'project'); 

//all of your data now in the result variable 

此外,它可能是閱讀和塊處理您的數據是個好主意。 Iteratorsgenerators可以幫助你。

+0

json有一些實例,其中Item = array [0] =(array [0] = array('key'=>'value'),所以迭代返回$ Key = [0],我需要使用前一個鍵其中$ key是一個字符串作爲表名。 – startingout