使用php加速递归foreach

时间:2017-10-19 01:31:14

标签: 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 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>

谢谢,

1 个答案:

答案 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

通过块读取和处理数据也是一个好主意。 Iteratorsgenerators可以帮助您解决此问题。