我正在尝试通过将每个重复值递增1来从插入到mysql数据库的csv文件中增加值。 因此,如果我将'processor-intel'插入我的数据库,如果存在,csv的值将增加1.这将导致'processor-intel1'等等。 如果我在我的csv中有13次“nvidia-graphic-card”,但是使用不同的规格,增量从1到10,结果将是:
'nvidia-graphic-card',
'nvidia-graphic-card1',
'nvidia-graphic-card2',
'nvidia-graphic-card3',
........
'nvidia-graphic-card9',
'nvidia-graphic-card10',
'nvidia-graphic-card10',
'nvidia-graphic-card10'
为什么增量在10点停止?
这是我使用的增量函数:
function increment_string($str, $separator = '-', $first = 1){
preg_match('/(.+)'.$separator.'([0-9]+)$/', $str, $match);
return isset($match[2]) ? $match[1].$separator.($match[2] + 1) : $str.$separator.$first;
}
我正在将csv中的每一行与数据库进行比较
$verificare = $database->select("SELECT alias FROM produse WHERE alias LIKE '%".$alias."%'");
for($x=0;$x<$database->countRows();$x++){
if($alias == $verificare['alias'][$x]){
$alias = $this->increment_string($verificare['alias'][$x], '-', 1);
}else{
$alias = $alias;
}
}
这是导入csv的完整代码
if($request->get($_POST["action"]) == "import"){
$file = $upload->file_upload("import", "media/import");
if(file_exists(DIR_UPLOAD_PHOTO . "/media/import/" . $file)){
$file = DIR_UPLOAD_PHOTO . "/media/import/" . $file;
$handle = fopen($file, "r");
if ($handle) {
$lines = explode("\r", fread($handle, filesize($file)));
}
$total_array = count($array);
$x = 0;
foreach($lines as $line){
if($x >= 1){
$data = explode("|", $line);
$titlu = trim(addslashes($data[0]));
$alias = $this->generate_seo_link($titlu);
$gramaj = trim($data[1]);
$greutate = trim($data[2]);
$pret_total = trim($data[3]);
$pret_redus = trim($data[4]);
$poza = trim($data[5]);
$pret_unitar = trim($data[6]);
$categorie = trim($data[7]);
$brand = trim(addslashes($data[8]));
$descriere = trim(addslashes($data[9]));
$vizibil = trim($data[10]);
$cod = trim($data[11]);
$nou = trim($data[12]);
$cant_variabila = trim($data[13]);
$congelat = trim($data[14]);
$tva = trim($data[15]);
$stoc = trim($data[16]);
if($cod != "" && $cod != " "){
$verificare = $database->select("SELECT alias FROM produse WHERE alias LIKE '%".$alias."%'");
for($x=0;$x<$database->countRows();$x++){
if($alias == $verificare['alias'][$x]){
$alias = $this->increment_string($verificare['alias'][$x]);
}else{
//$alias = $alias;
}
}
$database->insert(sprintf("insert into produse set
titlu='%s',
alias='%s',
gramaj='%s',
greutate='%s',
prettotal='%s',
pretredus='%s',
poza='%s',
pretunitar='%s',
categorie='%d',
brand='%s',
descriere='%s',
vizibil='%d',
cod='%s',
nou='%d',
cant_variabila='%d',
congelat = '%d',
tva = '%s',
stoc = '%d'
on duplicate key update
titlu='%s',
gramaj='%s',
greutate='%s',
prettotal='%s',
pretredus='%s',
poza='%s',
pretunitar='%s',
categorie='%d',
brand='%s',
descriere='%s',
vizibil='%d',
cod='%s',
nou='%d',
cant_variabila='%d',
congelat = '%d',
tva='%s',
stoc= '%d'",
$titlu, $alias,
$gramaj, $greutate, $pret_total, $pret_redus, $poza, $pret_unitar, $categorie,
$brand, $descriere, $vizibil, $cod, $nou, $cant_variabila, $congelat,
$tva, $stoc,
$titlu, $gramaj, $greutate,
$pret_total, $pret_redus, $poza, $pret_unitar, $categorie, $brand, $descriere,
$vizibil, $cod, $nou, $cant_variabila, $congelat, $tva, $stoc));
}
}
$x++;
}
}
}
答案 0 :(得分:1)
如果您的别名列类型设置为varchar ..将其更改为文本。
答案 1 :(得分:0)
你的preg_match找到了nvidia-graphic-card1并且对数字感到满意,并且不检查10.它被称为greedy or lazy。 阅读并重写你的正则表达式。
您可以使用regex101.com轻松测试正则表达式语句。
此正则表达式将您的数字与结果的其余部分分开,并以3美元的价格为您提供数字:
$re = '/(.+)([^0-9]{1})([0-9]{1,})$/';
$str = 'nvidia-graphic-card10';
preg_match($re, $str, $matches);
var_dump($matches);
请参阅此here
答案 2 :(得分:0)
你真的需要“分隔符” - 它看起来好像只能匹配字符串末尾的数字 - 默认情况下 PHP 正则表达式是贪婪的(不是100%确定其他答案是什么)?
function increment_string($str){
return preg_replace_callback('/\d*$/', function($match){
return intval($match[0])+1;
}, $str, 1);
}