php递归函数问题来获取字符串的一部分

时间:2017-11-24 08:13:00

标签: php recursion

我有一个字符串,它是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 KEY
Array
(
    [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);

请帮助我了解我做错了什么。

2 个答案:

答案 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