2015-03-02 2 views
3

Что происходит с моим массивом результатов здесь? Я ожидал, что размер массива результатов будет равен входному массиву, но его недостающие 3 записи .. куда они пошли? они не ходили в $ RET, так как они должны были ..Что происходит с моим массивом? элементы исчезают

код:

<?php 
init(); 
$list_xy = array(
    0 => array(
     'id' => '308', 
     'x' => '37', 
     'y' => '63' 
    ), 
    1 => array(
     'id' => '963', 
     'x' => '38', 
     'y' => '134' 
    ), 
    2 => array(
     'id' => '385', 
     'x' => '39', 
     'y' => '132' 
    ), 
    3 => array(
     'id' => '1231', 
     'x' => '50', 
     'y' => '199' 
    ), 
    4 => array(
     'id' => '788', 
     'x' => '51', 
     'y' => '59' 
    ), 
    5 => array(
     'id' => '1151', 
     'x' => '53', 
     'y' => '61' 
    ), 
    6 => array(
     'id' => '671', 
     'x' => '55', 
     'y' => '60' 
    ), 
    7 => array(
     'id' => '1487', 
     'x' => '55', 
     'y' => '55' 
    ) 
); 
$sorted_list_xy = sort_by_xy_distance($list_xy); 
$sorted_list_xy_size = count($sorted_list_xy, COUNT_NORMAL); 
$list_xy_size = count($list_xy, COUNT_NORMAL); 
var_dump($sorted_list_xy_size == $list_xy_size ? "looks right" : "something is wrong", $sorted_list_xy_size, $list_xy_size); 
die("died"); 


function sort_by_xy_distance($input_list) 
{ 
    $ret = array(); 
    $a = $input_list[0]; 
    array_push($ret, $input_list[0]); 
    $input_list[0] = null; 
    $i = 1; 
    for ($i = 1; $i < count($input_list); ++$i) { 
     if ($input_list[$i] == null) { 
      echo 'already added to list..'; 
      continue; 
     } 
     $ii = 1; 
     $tmpdistance = 0; 
     $nearest = array(
      'index' => -1, 
      'distance' => PHP_INT_MAX 
     ); 
     for ($ii = 1; $ii < count($input_list); ++$ii) { 
      if ($input_list[$ii] == null || $ii == $i) { 
       //echo 'already added to list..'; 
       continue; 
      } 
      $tmpdistance = abs($input_list[$ii]['x'] - $a['x']) + abs($input_list[$ii]['y'] - $a['y']); 
      if ($tmpdistance < $nearest['distance']) { 
       $nearest['index'] = $ii; 
       $nearest['distance'] = $tmpdistance; 
      } 
     } 
     assert($nearest['index'] != -1); 
     array_push($ret, $input_list[$nearest['index']]); 
     $a = $input_list[$nearest['index']]; 
     $input_list[$nearest['index']] = null; 
    } 
    return $ret; 
} 





function init() 
{ 
    error_reporting(E_ALL); 
    set_error_handler("exception_error_handler"); 
} 
function exception_error_handler($errno, $errstr, $errfile, $errline) 
{ 
    if (!(error_reporting() & $errno)) { 
     // This error code is not included in error_reporting 
     return; 
    } 
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline); 
} 

выход:

уже добавлен в list..already добавлен в list..already добавлено к list..string (18) "что-то не так" INT (5) Int (8) умер

ожидается выход: (что-то подобное)

уже добавлен в list..already добавлен в list..already добавлен в list..string (11) "выглядит правильно" Int (8) INT (8) умер

то, что я ожидал список, чтобы включить, чтобы: список, где разница в следующий-х [х] [у] как можно меньше, что было бы:

array(8) { 
    [0]=> 
    array(3) { 
    ["id"]=> 
    string(3) "308" 
    ["x"]=> 
    string(2) "37" 
    ["y"]=> 
    string(2) "63" 
    } 
    [1]=> 
    array(3) { 
    ["id"]=> 
    string(3) "788" 
    ["x"]=> 
    string(2) "51" 
    ["y"]=> 
    string(2) "59" 
    } 
    [2]=> 
    array(3) { 
    ["id"]=> 
    string(4) "1151" 
    ["x"]=> 
    string(2) "53" 
    ["y"]=> 
    string(2) "61" 
    } 
    [3]=> 
    array(3) { 
    ["id"]=> 
    string(3) "671" 
    ["x"]=> 
    string(2) "55" 
    ["y"]=> 
    string(2) "60" 
    } 
    [4]=> 
    array(3) { 
    ["id"]=> 
    string(4) "1487" 
    ["x"]=> 
    string(2) "55" 
    ["y"]=> 
    string(2) "55" 
    } 
    [5]=> 
    array(3) { 
    ["id"]=> 
    string(3) "385" 
    ["x"]=> 
    string(2) "39" 
    ["y"]=> 
    string(3) "132" 
    } 
    [6]=> 
    array(3) { 
    ["id"]=> 
    string(3) "963" 
    ["x"]=> 
    string(2) "38" 
    ["y"]=> 
    string(3) "134" 
    } 
    [7]=> 
    array(3) { 
    ["id"]=> 
    string(4) "1231" 
    ["x"]=> 
    string(2) "50" 
    ["y"]=> 
    string(3) "199" 
    } 
} 

я сосу на создание графических иллюстраций, но плохо дать ему тому назад. Это моя карта: map http://imagizer.imageshack.us/a/img633/3521/E0HGRe.png

Мне нужно посетить все черные точки. Это мой текущий путь: enter image description here

этот путь не очень оптимальный .. здесь путь я хочу: enter image description here

и это то, что функция сортировки пытается найти самый короткий путь к посетите все черные точки.

+0

Я прочитал программный код много. Однако это может быть сделано легче, если есть «пробелы», чтобы разбить длинные строки на «токены». Вы предоставляете много кода. Могу ли я предложить вам отформатировать его в соответствии с некоторыми легко читаемыми стандартами? т. е. [Цель этого руководства - уменьшить когнитивное трение при сканировании кода у разных авторов. Он делает это, перечисляя общий набор правил и ожиданий о том, как форматировать PHP-код] (http://www.php-fig.org/psr/psr-2/). Пространства между вещами «хорошие». Люди читают и пишут код - облегчают ли вам понимание вашего кода? –

+0

huh, на самом деле stackoverflow не позволяет мне заканчивать код пустой новой строкой: p .. во всяком случае, запускал его через phpformatter.com с PEAR-стилем, теперь он выглядит лучше? : o – hanshenrik

+0

Спасибо за это :-) –

ответ

0

Расчет расстояний Вы должны использовать теорему Пифагора (или просто hypot, как упоминалось в @prodigitalson). Для геокотельных координат вы можете использовать это: http://www.movable-type.co.uk/scripts/latlong.html

Давайте исправим ваш код. Каждый шаг вашего первого цикла должен принимать одно значение от входного значения и помещать его в результат. Но он продолжается внутри, поэтому некоторые шаги первого цикла не выполняют свою работу. Попробуйте удалить сначала продолжить.

$list_xy = array(
    0 => array(
     'id' => '308', 
     'x' => '37', 
     'y' => '63' 
    ), 
    1 => array(
     'id' => '963', 
     'x' => '38', 
     'y' => '134' 
    ), 
    2 => array(
     'id' => '385', 
     'x' => '39', 
     'y' => '132' 
    ), 
    3 => array(
     'id' => '1231', 
     'x' => '50', 
     'y' => '199' 
    ), 
    4 => array(
     'id' => '788', 
     'x' => '51', 
     'y' => '59' 
    ), 
    5 => array(
     'id' => '1151', 
     'x' => '53', 
     'y' => '61' 
    ), 
    6 => array(
     'id' => '671', 
     'x' => '55', 
     'y' => '60' 
    ), 
    7 => array(
     'id' => '1487', 
     'x' => '55', 
     'y' => '55' 
    ) 
); 
$sorted_list_xy = sort_by_xy_distance($list_xy); 
$sorted_list_xy_size = count($sorted_list_xy, COUNT_NORMAL); 
$list_xy_size = count($list_xy, COUNT_NORMAL); 
var_dump($sorted_list_xy_size == $list_xy_size ? "looks right" : "something is wrong", $sorted_list_xy_size, $list_xy_size); 
die("died"); 

function sort_by_xy_distance($input_list) 
{ 
    $ret = array(); 
    $a = $input_list[0]; 
    array_push($ret, $input_list[0]); 
    $input_list[0] = null; 
    $i = 1; 
    for ($i = 1; $i < count($input_list); ++$i) { 
//               up here 
//  if ($input_list[$i] == null) { 
//   echo 'already added to list..'; 
//   continue; 
//  } 
     $ii = 1; 
     $tmpdistance = 0; 
     $nearest = array(
      'index' => -1, 
      'distance' => PHP_INT_MAX 
     ); 
     for ($ii = 1; $ii < count($input_list); ++$ii) { 
      if ($input_list[$ii] == null || $ii == $i) { 
       //echo 'already added to list..'; 
       continue; 
      } 
      $tmpdistance = abs($input_list[$ii]['x'] - $a['x']) + abs($input_list[$ii]['y'] - $a['y']); 
      if ($tmpdistance < $nearest['distance']) { 
       $nearest['index'] = $ii; 
       $nearest['distance'] = $tmpdistance; 
      } 
     } 
     assert($nearest['index'] != -1); 
     array_push($ret, $input_list[$nearest['index']]); 
     $a = $input_list[$nearest['index']]; 
     $input_list[$nearest['index']] = null; 
    } 
    return $ret; 
} 
+0

Это не бесполезно. это быстрее. согласуется с c/C++, и он использует меньше кодов операций, чем post-increment, а значение «old» не возвращается, а только новое значение, поэтому нам не нужны 2 значения (старое значение AND новое значение, as post-increment does) Но не верьте мне на слово, сравните его сами: http://pastebin.com/raw.php?i=kvDpyNY3 мой вывод: самым быстрым был предварительный приращение. (...) разница была: 0.73859477043152 секунд. - и работает 4-5 раз, это согласовано, предварительный прирост составляет около 0,7 секунды быстрее, чтобы сосчитать до 100 миллионов, на моем сервере. – hanshenrik

+0

Итак, вы должны изменить свой массив_push. – sectus

+0

@hanshenrik, он отвечает вам на работу? – sectus

Смежные вопросы