将许多多级数组插入mysql库

时间:2012-12-23 00:38:08

标签: php mysql

我有一个功能分开我的文件的内容。示例文件:

001;"text1"
002;"text2"
003;"text3"
999
001;"tekst11"

有时某些索引有一些值:

120;"text2"
120;"text3"

我的功能:

function parseCSV($file) {
   $lines = file($file);
   $output = array();
   $i = -1;
   foreach($lines as $line) {
      $line = trim($line);
      if($line == "999") {
         $i++;
      } else {
         $ex = explode(";", $line, 2);
         $val = str_replace("\"", "", $ex[1]);
         //$dodaj = mysql_query("INSERT INTO `czynsz` (`$ex[$i]`) VALUES ('$val')");
         if(isset($output[$i][$ex[0]])) {         
            if(is_array($output[$i][$ex[0]])) {

               $output[$i][$ex[0]][] = $val;
            } else {
               $output[$i][$ex[0]] = array($output[$i][$ex[0]], $val);
            }
         } else {
            $output[$i][$ex[0]] = $val;
         }
         $dodaj = mysql_query("INSERT INTO `czynsz` (`$ex[$i]`) VALUES ('$val')");
      }
   }
   return $output;
}
$csvdata = parseCSV("woda.txt");


echo "<pre>\r\n";
print_r($csvdata);
echo "</pre>\r\n";

上面的脚本通过分隔符(999)使我成为多级数组树和单独的数组,因为在我的文件中有很多数组...当索引有很多值时 - 脚本为他提供了内部树。例如:

Array
    (
    [0] => Array
        (
        [001] => 06-001-03-13
        [002] => 06447
        [003] => F
        ...
        [097] =>
        [120] => Array
            (
            [0] => text1
            [1] => text2
            )
        )
    [1] => Array
    ...

我的问题是: 我在MySQL基础中保存这个大型数组有问题。数组中的每个索引都具有相同的数据库。当相同的索引具有许多值(例如120)时,它可能是内爆的。全心全意地感谢您提供任何形式的帮助...... :(

2 个答案:

答案 0 :(得分:1)

创建MySQL表:

CREATE TABLE `czynsz` (
  `id` INT NOT NULL ,
  `value` VARCHAR( 255 ) NOT NULL
) ENGINE = InnoDB;

ALTER TABLE `czynsz` ADD UNIQUE `unique` ( `id` ) 

然后使用以下php代码插入数据

ini_set('error_reporting', E_ALL); // just for debugging remove later
ini_set('display_erorrs', 1); // just for debugging remove later

function parseCSV($file) {
    $lines = file($file);
    $output = array();
    $i = 0;
    foreach($lines as $line) {
        $line = trim($line);
        if($line == "999") {
           $i++;
           continue;
        }

        list($id, $val) = explode(";", $line, 2);

        $val = str_replace("\"", "", $val);

        $result = mysql_query("
            INSERT INTO `czynsz` (
                id, 
                `value`
            ) VALUES (
                '$id',
                '$val'
            ) ON DUPLICATE KEY UPDATE 
                `value` = CONCAT(`value`, ', ', '$val')"
        );
        if(!$result) {
            die(mysql_error());
        }
        if(isset($output[$i][$id])) {
            if(is_array($output[$i][$id])) {
                $output[$i][$id][] = $val;
            } else {
                $output[$i][$id] = array($output[$i][$id], $val);
            }
        } else {
            $output[$i][$id] = $val;
        }
    }
   return $output;
}

答案 1 :(得分:1)

使用PHP sledgehammer解决方案......

假设您只想存储数组而不需要查询不同的节点,请使用serialize函数将数组转换为字符串表示形式。您可以轻松提取数据,然后使用unserialize取回原始数组。

$s_arr = serialize($my_array);

$my_array = unserialize($s_arr);

如果您需要访问数据库中的节点,那么我认为MySQL不是一个好的解决方案,因为涉及到复杂性。如果您想要一个键值存储,那么您应该查看NoSQL解决方案,例如Redis