修改查询结果后,我得到了一个如下所示的数组:
[0] => foo (bar1)
[1] => bar (foo2)
[2] => bas
[3] => foo (bas3)
[4] => bar
如您所见,有些值包含括号,有些则没有。
我需要一个自己的(新的)数组中每个值的括号部分,键应该保留,如果第一个数组的值中没有括号,第二个数组中的值应该是
,两个数组中的数组键应该相同,因此第二个数组应该如下所示:
[0] => (bar1)
[1] => (foo2)
[2] =>
[3] => (bas3)
[4] =>
到目前为止,我得到了这个PHP代码:
$pattern = "/\((.*?)\)/"; //Looks for text in parentheses
$array1 = <see above>
$array2 = array(); //The second array, which should contain the extracted parentheses parts
foreach($array1 as $index => $value) {
$array2 = preg_grep($pattern,$array1);
}
这很好用,但是当找到圆括号时,它将$array1
的整个值显示为$array2
中的值,$array1
中没有圆括号的值完全丢失。(...)-part,如果没有检测到括号,从$array1
中删除它,并将
添加到$array2
。我尝试使用preg_match来实现这一点,但这给了我一个数组到字符串的转换错误。
有人知道如何解决这个问题吗?
5条答案
按热度按时间hlswsv351#
使用
array_walk()
的变体:输出显然是:
ef1yzkbh2#
使用foreach和格式化字符串:
iyzzxitl3#
您可以对每个元素使用正则表达式。
这将找到一个左括号。后面跟着任何字符,直到一个右括号。当找到时,第一个匹配将返回
。omtl5h9j4#
我认为最简单的是,这个任务适合迭代调用
strstr()
(strpbrk()
具有与字符掩码相同的功能),如果找不到所需的左括号,则回退到
。代码:(Demo)
与Casimir的
sscanf()
解决方案不同,我更喜欢使用array_map()
,并在解析(using*
)时忽略括号前的子字符串。在尝试解析每个字符串时,该函数将返回一个包含
null
或括号值的单元素数组。如果null
返回到所需的
字符串。在解析模式中,
%*[^(]
表示匹配但不保留字符串开头到第一个左括号之间的字符。然后%s
将匹配并保留所有后续的非空白字符。保留的括号子字符串可以作为sscanf()
返回数组中的第一个元素访问。代码:(Demo)
它的正则表达式版本是:(Demo)
或者使用
preg_match()
:(一对四对一对)bcs8qyzn5#
这可能会有帮助