我正在针对一个80K行的关联(非数字键)数组运行它,从2.1K json文件解码:
$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分钟才能运行 - 这可能会很好 - 但我想问一下是否有任何方法可以通过更好的编码来加速这个功能。 / p>
谢谢,
答案 0 :(得分:0)
似乎总是如此:if(!is_array($key)) $k = $key;
您没有使用$level
变量。你为什么需要它?
Globals真的很糟糕。您可能需要将变量发送到函数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
通过块读取和处理数据也是一个好主意。 Iterators或generators可以帮助您解决此问题。