2

X 座標と Y 座標の配列があります。0,0 に最も近いポイントを見つけて、0,0 から最も近いポイントから最も遠いポイントに並べ替えるにはどうすればよいですか?

  <?php
        $array = array(array("x" => 10,
                             "y" => 10),

                       array("x" => 120,
                             "y" => 560),

                       array("x" => 950,
                             "y" => 23),

                       array("x" => 78,
                             "y" => 40),);
    ?>

前もって感謝し、私の英語で申し訳ありません:|

4

5 に答える 5

1

usort の使用:

<?php
//your array
$array = array(array("x" => 10,
                     "y" => 10),

               array("x" => 120,
                     "y" => 560),

               array("x" => 950,
                     "y" => 23),

               array("x" => 78,
                     "y" => 40),);

//define a compare function
function cmp($a,$b){
    //get the squared distance of a and b
    $distA_SQ = $a['x']*$a['x']+$a['y']*$a['y'];
    $distB_SQ = $b['x']*$b['x']+$b['y']*$b['y'];

    //if squared distances are the same, return 0
    if($distA_SQ==$distB_SQ)return 0;

    //distances are not the same so return 1 if a larger than b or -1 if b larger than a
    return $distA_SQ>$distB_SQ?1:-1;
}

//run the sort function
usort($array, 'cmp');

//output the array
var_dump($array);

http://codepad.org/OBH1cskb

また、点 A の距離が B より大きいかどうかを判断するために、距離を平方する必要はありません。高価で不要です。

編集:以下のコードと説明にコメントを追加しました

これは、ユーザー定義の比較関数を使用するusortを使用します。usort は、比較関数を呼び出して一度に 2 つの値 (通常は $a と $b として渡される) を渡すことでクイックソートを実行して配列を調べ、$a が $b より小さい場合は比較関数が -1 を返すことを期待します。 、$a が $b と等しい場合は 0、$a が $b より大きい場合は 1。usort の詳細については、マニュアルを参照してください。

于 2013-03-22T16:37:41.473 に答える
0
$array = array(
    array("x" => 10, "y" => 10),

    array("x" => 120, "y" => 560),

    array("x" => 950, "y" => 23),

    array("x" => 78, "y" => 40)
);

$start_point_array = $array;
$end_point_array = $array;
$farthest_points = array();
$farthest_distance = 0;

foreach($start_point_array as $index => $start_point) {
    for($i = $index + 1; $i < count($end_point_array); $i++) {
        $end_point = $end_point_array[$i];
        $distance = sqrt(pow($end_point['x'] - $start_point['x'], 2) + pow($end_point['y'] - $start_point['y'], 2));
        if($distance > $farthest_distance) {
            $farthest_distance = $distance;
            $farthest_points = array($start_point, $end_point); // Or whatever
        }
    }
}
于 2013-03-22T16:25:27.303 に答える
0

これを試して

<?php
$array = array(array("x" => 10,
                     "y" => 10),

               array("x" => 120,
                     "y" => 560),

               array("x" => 950,
                     "y" => 23),

               array("x" => 78,
                     "y" => 40),);


$distance = array();
 $req_array = array();
 foreach($array as $subArray)
{
 $distance[] = sqrt(pow(($subArray[x],2)+pow(($subArray[y],2));
}

asort($distance);

foreach($distance as $key=>$value)
{
  $req_array[] = $array[$key];
}


print_r($distance);
print_r($req_array);

?>
于 2013-03-22T16:18:13.157 に答える
0

http://www.ltcconline.net/greenl/courses/154/factor/circle.htmをチェックしてください

function calculateDistance($x,$y)
{
    //apply formula
    return sqrt(pow($x, 2) + pow($y, 2)); //<--Sammitch pointed out directly 
}
$data = array();
foreach($array as $key=>$distance)
{//this is better because you can have points that have the same distance
   $data[calculateDistance($distance['x'],$distance['y'])][] = $key;
}
    ksort($data);

結果

 in:
$array = array(array("x" => 10,
                             "y" => 10),

                       array("x" => 120,
                             "y" => 560),
                       array("x" => 120,
                             "y" => 560),
                       array("x" => 950,
                             "y" => 23),

                       array("x" => 78,
                             "y" => 40));
    output:
    array (size=4)
      14 =>  //<--key is the distance and the value are the keys from your array
        array (size=1)
          0 => int 0
      87 => 
        array (size=1)
          0 => int 4
      572 => 
        array (size=2)
          0 => int 1
          1 => int 2
      950 => 
        array (size=1)
          0 => int 3
于 2013-03-22T16:16:59.067 に答える