使用php加速递归foreach
我正在对一个关联(非数字键)数组运行此操作,该数组是80K行,从2.1K json文件解码:使用php加速递归foreach,php,json,performance,recursion,Php,Json,Performance,Recursion,我正在对一个关联(非数字键)数组运行此操作,该数组是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 a
$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分钟才能运行-这可能是最好的-但我想问一下,是否有任何方法可以通过更好的编码来加速该函数
谢谢,这似乎总是正确的:
如果(!is_array($key))$k=$key代码>
您不能使用$level
变量。你为什么需要它
全球化真是个坏主意。您可能需要向函数而不是值发送变量:
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
此外,按块读取和处理数据也是一个好主意。或者可以帮助您。如果您使用php:<7.0,您可以使用SplFixedArray,并且在函数内部,递归函数不会返回任何内容,因为您不分配它。我认为SplFixedArray不适用-“SplFixedArray具有固定长度,只允许范围内的整数作为索引”。我认为,由于键是我想要保留的数据的字符串,因此这是不可用的。json有一些实例,其中Item=array[0]=(array[0]=array('key'=>'value'),因此迭代返回$key=[0],我需要使用上一级的键,其中$key是字符串作为表名。