function resort_properties($prop)
{
$resorted = $undefined = array();
foreach ($prop as $k => $val) {
$index = null;
// Дефолтное значение индекса порядка для свойства. Если свойство не знакомо, то index так и останется null.
preg_match_all('@\\s*?(.*?[^:]:).*@ism', $val, $matches, PREG_SET_ORDER);
// Решаем проблему с пробелами перед :
$property = preg_replace('@\\s*:@ism', ':', trim($matches[0][1]));
if (is_array($this->sort_order[0])) {
// Если порядок сортировки разбит на группы свойств
foreach ($this->sort_order as $pos => $key) {
// для каждой группы свойств
foreach ($this->sort_order[$pos] as $p => $k) {
// для каждого свойства
if (strpos(' ' . trim($property), ' ' . $k . ':') !== FALSE) {
$through_number = $this->get_through_number($k);
// определяем "сквозной" порядковый номер
if ($through_number !== false) {
$index = $through_number;
}
}
}
}
} else {
foreach ($this->sort_order as $pos => $key) {
if (strpos(' ' . trim($property), ' ' . $key . ':') !== FALSE) {
$index = $pos;
}
}
}
if ($index === null or strpos($val, 'exp')) {
$undefined[] = $val;
} else {
// Добавляет к уже существующей записи с определенном порядковым номером еще одну запись с таким же порядковым номером
// либо создает новую запись если с таким порядковым номером ничего еще не встречалось
if (isset($resorted[$index])) {
$resorted[$index] .= $val;
} else {
$resorted[$index] = $val;
}
}
}
ksort($resorted);
if (is_array($this->sort_order[0])) {
if (count($resorted) > 0) {
// Если свойства разделены на группы
$resorted = $this->separate_property_group($resorted);
}
if (count($undefined) > 0 and substr_count(substr($undefined[0], 0, 2), "\n\n") === 0) {
$undefined[0] = "\n" . $undefined[0];
}
}
$resorted = array_merge($resorted, $undefined);
// добавляем в конец нераспознанное
return $resorted;
}