【问题标题】:Speed up recursive foreach using php使用php加速递归foreach
【发布时间】:2018-03-31 00:02:07
【问题描述】:

我正在对一个 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 分钟以上才能运行 - 这可能已经达到了最佳效果 - 但我想问是否有任何方法可以通过更好的编码来加速这个功能。

谢谢,

【问题讨论】:

  • 如果你使用 php:
  • 我认为 SplFixedArray 不适用 - “SplFixedArray 是固定长度的,并且只允许范围内的整数作为索引”。我认为由于键是我要保留的数据的字符串,因此这是不可用的。

标签: php json performance recursion


【解决方案1】:

似乎总是如此: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 可以帮助您。

【讨论】:

  • json 有一些实例,其中 Item= array[0] =(array[0] =array('key'=>'value') 所以迭代返回 $Key = [0],我需要使用上一级的键,其中 $key 是一个字符串作为表名。
猜你喜欢
  • 1970-01-01
  • 2013-12-31
  • 2021-11-27
  • 2018-04-22
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多