使用php加速递归foreach

使用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

我正在对一个关联(非数字键)数组运行此操作,该数组是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分钟才能运行-这可能是最好的-但我想问一下,是否有任何方法可以通过更好的编码来加速该函数


谢谢,

这似乎总是正确的:
如果(!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是字符串作为表名。