Вот краткое описание алгоритма пересечения, представленного в ссылке DuduAlul .
Решение требует использования дерева поиска, способного выполнять диапазонные запросы. Запрос диапазона запрашивает все элементы со значениями между K1 и K2, и это должна быть операция O (R + log N), где N - общее количество элементов дерева, а R - количество результатов.
Алгоритм использует подход развертки:
1) Сортировать все левые и правые края прямоугольника в соответствии с их значением X в список L.
2) Создайте новое пустое дерево поиска диапазона T, для Y упорядочения вершин / низов прямоугольника
3) Создайте новый пустой набор результатов RS уникальных пар прямоугольников
4) Траверс L в порядке возрастания. Для всех V в L:
& nbsp; & nbsp; & V.bsRightEdge ()
& nbsp; & nbsp; & nbsp; & nbsp; T.remove (V.rectangle. top)
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; T.remove (V.rectangle.bottom)
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; else
& nbsp ; & NBSP; & NBSP; & NBSP; & NBSP; & NBSP; Для всех U в T.getRange (V.rectangle.top, V.rectangle.bottom)
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; RS.add (< V.rectangle, U.rectangle>)
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; Tadd (V.rectangle.top)
& nbsp; & nbsp; & nbsp; & nbsp; & nbsp; & nbsp; ; & nbsp; & nbsp; T.add (V.rectangle.bottom)
5) return RS
Сложность по времени составляет O (R + N log N), где R - это фактическое количество пересечений.
- РЕДАКТИРОВАТЬ -
Я только что выяснил, что решение не полностью корректно - тест пересечения в дереве T пропускает некоторые случаи. Дерево должно поддерживать интервалы Y, а не значения Y, и в идеале оно должно быть Interval Tree .
Ага! После небольшого «резинового утка» с плюшевой куклой сварливого гнома на моем столе я нашел решение:
$data = file_get_contents($tmpFile); $params = array( 'http' => array( 'method' => 'PUT', 'header' => "Authorization: Basic " . base64_encode($this->ci->config->item('ws_login') . ':' . $this->ci->config->item('ws_passwd')) . "\r\nContent-type: text/xml\r\n", 'content' => file_get_contents($tmpFile) ) ); $ctx = stream_context_create($params); $response = @file_get_contents($url, false, $ctx); return ($response == '');
Если в вашем eXist-db включен интерфейс SOAP, есть библиотека с открытым исходным кодом под названием PheXist , которая упростит взаимодействие с базой данных.
У меня работает CURL. Вот фрагмент моего кода,
$handle = curl_init ($server_url);
if ($handle)
{
// specify custom header
$customHeader = array(
"Content-type: $file_type"
);
$curlOptArr = array(
CURLOPT_PUT => TRUE,
CURLOPT_HEADER => TRUE,
CURLOPT_HTTPHEADER => $customHeader,
CURLOPT_INFILESIZE => $file_size,
CURLOPT_INFILE => $file,
CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
CURLOPT_USERPWD => $user . ':' . $password,
CURLOPT_RETURNTRANSFER => TRUE
);
curl_setopt_array($handle, $curlOptArr);
$ret = curl_exec($handle);
$errRet = curl_error($handle);
curl_close($handle);
РЕДАКТИРОВАТЬ: только что обновил мой код. Я сам не использую аутентификацию, поэтому это не проверялось.
function _publish($service, $doc) {
$params = array(
'http' => array(
'method' => 'PUT'));
$context = stream_context_create($params);
$fp = fopen($service, 'rb', false, $context);
$response = fwrite($fp,file_get_contents($doc));
if ($response === false) {
return false;
}
// Pull out the status code from the header
$metaData = stream_get_meta_data($fp);
preg_match_all("/HTTP\/1\.[1|0]\s(\d{3})/", $metaData['wrapper_data'][0], $matches);
$code = end($matches[1]);
if ($code == 200) {
return true;
} else {
return false;
}
}
из http://www.littlehart.net/atthekeyboard/2008/01/11/how-to-http-put-a-file-somewhere-using-php/