找出以下字符串中出现成对的括号
{((}[)[][)
要求交叉出现的也需要返回
<?php
/**
* Created by PhpStorm.
* User: archerZdip
* Date: 2019-03-04
* Time: 18:00
*/
/**
* PHP实现栈数据结构和括号匹配
*
* - $str string `数据字符串`
*
* @param string $str
* @return array|bool
*/
function checkBracket(string $str)
{
if (!$str) return false;
$arr = str_split($str);
// 左括号集合
$left = ['{', '[', '('];
// 右括号集合
$right = ['}', ']', ')'];
// 栈集合
$stack = [];
// 结果集合
$res = [];
while (count($arr) > 0) {
// 获取第一个字符
$shift = array_shift($arr);
if (in_array($shift, $left, true)) {
// 把出现的左括号放入栈中
array_push($stack, $shift);
} else if (in_array($shift, $right, true)) {
// 获取概括号的key
$rightKey = array_search($shift, $right, true);
if ( count($stack) > 0 ) {
// 判断栈里是否存在对应括号值
$pos = array_search($left[$rightKey], $stack, true);
if ( $pos !== false ) {
// 删除对应位置
unset($stack[$pos]);
// 将结果存入数组中
array_push($res, $left[$rightKey] . $shift);
}
}
}
}
return empty($res) ? false : $res;
}
$test = '{((}[)[][)';
var_dump(checkBracket($test));
结果
array (size=4)
0 => string '{}' (length=2)
1 => string '()' (length=2)
2 => string '[]' (length=2)
3 => string '()' (length=2)
若有不足请见谅包含!