Я не смог найти авторитетного ответа на этот вопрос, хотя я на 99.9% уверен, что это правда. Такие вещи, как принятый ответ, чтобы полагаться на то, что это правда, поскольку я ожидаю, что много другого кода. Но может ли кто-нибудь, кто действительно что-то знает о preg_match_all
(а не наблюдением, а указанным требованием или указанным алгоритмом), подтверждает, что это гарантированное поведение? Я не могу его извлечь из документации.
Мой пример использования очень прост:
preg_match_all("/$regexp/", $content, $matches, PREG_OFFSET_CAPTURE);
И я знаю, что $regexp
не содержит подматрицы, поэтому в документации мне сообщается, что $matches[0]
будет массивом из 2-элементных массивов, где каждый подмассиво имеет элементы с числовым ключом 0, содержащим строка, соответствующая шаблону, и числовой ключ 1, содержащий смещение в $content
, в котором произошло совпадение. И хотя кажется разумным, что элементы массива будут упорядочены путем увеличения смещения, я не вижу, где это требуется, так что это будет ошибка, если бы это было не так. Хотя я не могу себе представить, как это можно было бы сделать для полезного эффекта, возможно, есть способ реализовать 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
, обязательно являются числовыми?