Ich konnte keine verbindliche Antwort darauf finden, obwohl ich 99,9% sicher bin, dass es wahr ist. Dinge wie die akzeptierten answer auf sich zu verlassen, es ist wahr, wie ich es von vielen anderen Code erwartet. Aber kann jemand, der wirklich etwas über preg_match_all
weiß (nicht durch Beobachtung, sondern durch spezifizierte Anforderung oder spezifizierten Algorithmus) bestätigen, dass dies garantiertes Verhalten ist? Ich kann es nicht aus der Dokumentation herauslesen.Ist die Reihenfolge eines preg_offset_capture-Sub-Arrays * garantiert * größer Offset?
Mein Anwendungsfall sehr einfach:
preg_match_all("/$regexp/", $content, $matches, PREG_OFFSET_CAPTURE);
Und ich weiß, dass $regexp
keine Untermuster enthält, so dass die Dokumentation sagt mir, dass $matches[0]
wird ein Array von 2-Element-Arrays sein, wobei jedes Unterfeld Elemente mit dem numerischen Schlüssel 0 enthält, der eine Zeichenfolge enthält, die mit dem Muster übereinstimmt, und numerischer Schlüssel 1, der den Versatz in $content
enthält, bei dem die Übereinstimmung aufgetreten ist. Und während es nur vernünftig erscheint, dass die Array-Elemente durch zunehmenden Offset geordnet sind, sehe ich nicht, wo das erforderlich ist, so dass es ein Fehler wäre, wenn es nicht der Fall wäre. Obwohl ich mir nicht vorstellen kann, wie man es sinnvoll einsetzen könnte, könnte es vielleicht eine Möglichkeit geben, preg_match_all
mit mehreren Threads zu implementieren, die ihre Teilergebnisse anhängen, ohne in eine vollständig sortierte Reihenfolge zu gehen.
In meinem speziellen Fall interessiere ich mich nur für Offsets, nicht für die übereinstimmenden Strings, aber es ist wichtig, dass die Offsets zunehmen. Also mit Riemen und Strapsen Mentalität I codiert:
preg_match_all("/$regexp/", $content, $matches, PREG_OFFSET_CAPTURE);
$offsets = array();
foreach ($matches as $match) {
$offsets[] = $match[1];
}
sort($offsets);
So anders ausgedrückt, ist der letzte sort($offsets)
eine garantierte Verschwendung von Zyklen?
Und wenn es mich nicht in tiefe Schwierigkeiten bringt, eine verwandte, aber potentiell getrennte Frage zu stellen, wenn die Sorte potentiell nützlich wäre, wäre es mehr/weniger/gleich effizient, das Standardflag SORT_REGULAR
wie gezeigt zu nehmen, oder explizit anzugeben, SORT_NUMERIC
, da die innerhalb preg_match_all
erzeugten Offsets notwendigerweise numerisch sind?
Interessante Frage. (Hatte eine Antwort, aber sprach zu früh - bevor ich die ganze Frage gelesen habe - _D'oh! _) – ridgerunner
Jemand muss sich den [PHP Quellcode] (http://php.net/git.php) ansehen :) – zx81
Ich verstehe die Frage nicht wirklich. Jedes übereinstimmende Element ist ein Array-Element, das auch ein Array von nur zwei Elementen ist, die übereinstimmende Zeichenfolge [0] und ihr Offset [1]. Ich denke nicht, dass die Offsets in einem einzigen Array angeordnet sind. Obwohl dieses Verhalten möglicherweise in Kombination mit anderen Flags geändert werden kann. Aber da es sequentiell aufgebaut ist, ist es schwer, sich irgendwelche Out-of-Order-Ergebnisse vorzustellen. Der Stapel wird in Regex stark verwendet, um den Positionskontext beizubehalten. – sln