我有一个字符串,它是mysql create query:
$str = "CREATE TABLE `custom_groupmanager` (
`groupid` int(11) NOT NULL AUTO_INCREMENT,
`groupname` varchar(100) DEFAULT NULL,
`owner` int(4) DEFAULT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
`active` int(1) DEFAULT NULL,
`pid` int(4) DEFAULT NULL,
`col1` int(5) DEFAULT NULL,
`col2` int(5) DEFAULT NULL,
PRIMARY KEY (`groupid`),
UNIQUE KEY `groupname` (`groupname`,`pid`),
UNIQUE KEY `somaname` (`col1`,`col2`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1";
我需要像这样
获取数组中的UNIQUE KEYArray
(
[0] => UNIQUE KEY `groupname` (`groupname`,`pid`)
[1] => UNIQUE KEY `somaname` (`col1`,`col2`)
)
所以我尝试了一个递归函数,但似乎失败了。这是我的代码
$tmparr = array();
$newarray = filterunique($str,$tmparr);
function filterunique($str,$tmparr){
if(strpos($str, "UNIQUE KEY") != FALSE){
$unitmp = strstr($str,"UNIQUE KEY");
$tmpstr = strstr($unitmp,")",TRUE)."),\n";
array_push($tmparr,strstr($unitmp,")",TRUE).")");
print_r($tmparr);
$str=str_replace($tmpstr, "", $str);
filterunique($str,$tmparr);
}else{
return $tmparr;
}
}
print_r($newarray);
请帮助我了解我做错了什么。
答案 0 :(得分:1)
我修改了您的代码。你犯了两个错误:
使用\n
制作$ tmpstr可能' \ r \ n'在Windows中,并在括号,
后添加逗号),
,在第二行中不存在。因此,您的代码不会删除找到的字符串,从而产生无限循环。
第二个错误是你不会在If-true block中返回任何内容。
function filterunique($str,$tmparr = []){
if(strpos($str, "UNIQUE KEY") != FALSE) {
$unitmp = strstr($str,"UNIQUE KEY");
$tmpstr = strstr($unitmp,")",TRUE).")";
array_push($tmparr,$tmpstr);
$str = str_replace($tmpstr, '', $str);
$tmparr = filterunique($str,$tmparr);
}
return $tmparr;
}
更改后,code works
答案 1 :(得分:0)
您可以使用正则表达式执行您想要的操作:
<?php
$sql = 'CREATE TABLE `custom_groupmanager` (
`groupid` int(11) NOT NULL AUTO_INCREMENT,
`groupname` varchar(100) DEFAULT NULL,
`owner` int(4) DEFAULT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
`active` int(1) DEFAULT NULL,
`pid` int(4) DEFAULT NULL,
`col1` int(5) DEFAULT NULL,
`col2` int(5) DEFAULT NULL,
PRIMARY KEY (`groupid`),
UNIQUE KEY `groupname` (`groupname`,`pid`),
UNIQUE KEY `somaname` (`col1`,`col2`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=latin1';
$matches = [];
preg_match_all('/UNIQUE KEY.*\n/', $sql, $matches);
var_dump($matches[0]);
您将拥有这样的数组:
array(2) {
[0]=>
string(45) "UNIQUE KEY `groupname` (`groupname`,`pid`),
"
[1]=>
string(39) "UNIQUE KEY `somaname` (`col1`,`col2`)
"
}
您可以改进正则表达式(或使用array_map来执行此操作)以删除尾随&#34;,&#34;。
并且:也许它可以更方便地使用SQL来获取这些信息,解析SQL字符串似乎很奇怪。
如果您需要一些示例,请检查SQL - How to get the Unique Key's Column Name from Table。