如何将来自multidiemsional数组的大量内容存储到mysql数据库中?

时间:2018-05-21 08:23:58

标签: php mysql loops multidimensional-array foreach

这是我的阵列:

array(4) {
  [0]=>
  array(500000) {
    ["1234"]=>
    array(3) {
      ["fileName"]=>
      string(10) "monkey.jpg"
      ["path"]=>
      string(20) "animales/monkey.jpg"
      ["dateTime"]=>
       string(19) "2016-10-12 19:46:25"
    }
    ["3456"]=>
    array(3) {
      ["fileName"]=>
      string(9) "horse.jpg"
      ["path"]=>
      string(19) "animales/horse.jpg"
      ["dateTime"]=>
       string(19) "2016-10-12 19:46:25"
    }
    .... and many more...
  }
 ... and many more...
}

我想将内容存储到我的数据库中:

$sql = "INSERT INTO files (id,fileName,path,dateTime) values(?,?,?,?) ";

foreach($array as $key => $value){
    if(is_array($value)){
        foreach($value as $key => $v){
            foreach($v as $k => $item){
                if(is_array($v)){
                    $s = str_replace("\\","",$v['dateTime']);
                    $d = strtotime($s);
                    $dateTime = date('Y.m.d H:i:s', $d);  
                    $q->execute(array($key,$v['fileName'],$v['path'],$dateTime));
                }
            }
        }
    }
}

我的问题是,我有超过500.000个条目。所以我的系统崩溃了。我认为这是因为循环内部有很多循环。有没有办法只用一个循环或其他方式更快地读取内容?

注意:$array是一个像这样创建的拼接数组($ array [] = array_splice($ orinal_array,0,count($ original_array));我实际上是为了使系统更快

2 个答案:

答案 0 :(得分:2)

请看一下这个答案:

MYSQL import data from csv using LOAD DATA INFILE

您应该将数据转换为csv并依赖LOAD DATA INFILE

不是说你应该将csv文件上传到你的mysql服务器以依赖这个Mysql功能

答案 1 :(得分:1)

使用serializejson_encode可能是一种方法。这样,您就不必遍历所有元素并处理斜杠,因为所有元素都变成了一个字符串,以后可以使用json_decode读取或反序列化PHP函数。

附注:请使用有意义的变量名称,以便帮助您的人不必弄明白您的意思。即:

foreach($v as $k => $item){

更糟糕
foreach($fileCollection as $fileIterator => $fileDetails){

如果您真的需要遍历所有数据并将每个文件属性存储在一个单独的列中,那么您只需要2x foreach(一个用于收集,一个用于每个文件)。

foreach($globalCollection as $fiveHundredThousandRows){ 
    foreach ($fiveHundredThousandRows as $fileIterator => $fileData){
        $timestamp = strtotime($fileData['dateTime']);
        $q->execute(array($fileIterator,$fileData['fileName'],$fileData['path'],date( 'Y.m.d H:i:s', $timestamp)));
    }
}