我无法找到权威的答案,尽管我99.9%确定这是正确的。像接受的答案依赖于它是真实的,因为我预计其他很多代码也会这样做。但是,真正了解preg_match_all
(不是通过观察而是通过规定要求或规定算法)的人能否确认这是保证的行为?我无法从文档中得出结论。
我的使用情况非常简单:
preg_match_all("/$regexp/", $content, $matches, PREG_OFFSET_CAPTURE);
我知道$regexp
不包含任何子模式,所以文档告诉我,$matches[0]
将是一个由2元素数组组成的数组,其中每个子数组具有数值键0,包含匹配模式的字符串,以及数值键1,包含匹配发生在$content
中的偏移量。虽然只有数组元素按偏移量递增排序似乎是合理的,但我看不到这是必需的,如果不是这种情况就会出现bug。虽然我无法想象如何才能做到有效地实现它,也许有一些方法可以使用多线程实现preg_match_all
,将其部分结果附加而不合并成完全排序的顺序。
在我的情况下,我只关心偏移量,而不关心匹配的字符串,但偏移量递增非常重要。所以,我采用了保守的编码方式:
preg_match_all("/$regexp/", $content, $matches, PREG_OFFSET_CAPTURE);
$offsets = array();
foreach ($matches as $match) {
$offsets[] = $match[1];
}
sort($offsets);
换句话说,最终的sort($offsets)
是否肯定是浪费循环次数?
如果问一个相关但可能是单独问题不会让我陷入麻烦,那么假设排序是有用的,采用默认的SORT_REGULAR
标志如所示,还是明确指定SORT_NUMERIC
标志更有效率,因为preg_match_all
中产生的偏移量必须是数字?