-1

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

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)时,它可能是内爆的。衷心感谢您提供任何形式的帮助... :(

4

2 回答 2

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;
}
于 2012-12-23T01:12:02.553 回答
1

使用 PHP 大锤解决方案...

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

$s_arr = serialize($my_array);

$my_array = unserialize($s_arr);

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

于 2012-12-23T01:17:04.357 回答