データの整列
Posted feedbacks - PHP
PHPをOtherとして投稿してしまいました。すいません。
# php test.php (0, 0) (1, 1) (2, 0) (2, 1) (3, 1) (3, 2) (3, 3)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | <?php
function sortXY($arrXY) {
$arrSort = array();
foreach ( $arrXY as $XY ) {
$key = $XY[0];
if(!isset($arrSort[$key])) {
$arrSort[$key] = array($XY);
} else {
$pos = count($arrSort[$key]);
foreach ( $arrSort[$key] as $i=>$sameX ) {
if($XY[1] < $sameX[1]) {
$pos = $i;
break;
}
}
array_splice($arrSort[$key], $pos, 0, array($XY));
}
}
ksort($arrSort);
$arrResult = array();
foreach ( $arrSort as $arrTmp ) {
foreach ( $arrTmp as $XY ) {
$arrResult[] = $XY;
}
}
return $arrResult;
}
$arrXY = array(
array(0, 0),
array(3, 1),
array(2, 1),
array(2, 0),
array(1, 1),
array(3, 3),
array(3, 2),
);
$arrAscXY = sortXY($arrXY);
foreach($arrAscXY as $XY) {
echo '('.join($XY, ', ').")\n";
}
?>
|
# php test.php (x, y) 昇順: (0, 0) (1, 0) (1, 1) (2, 1) (2, 2) (2, 9) (3, 1) (3, 2) (3, 3) (0, 0) からの距離の昇順: (0, 0) distance=0 (1, 0) distance=1 (1, 1) distance=1.41 (2, 1) distance=2.24 (2, 2) distance=2.83 (3, 1) distance=3.16 (3, 2) distance=3.61 (3, 3) distance=4.24 (2, 9) distance=9.22
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 | <?php
function sortXY($arrXY, $byDistance = false) {
$arrSort = array();
foreach ( $arrXY as $XY ) {
$key = $byDistance ? $XY[0]*$XY[0] + $XY[1]*$XY[1] : $XY[0];
if(!isset($arrSort[$key])) {
$arrSort[$key] = array($XY);
} else {
$pos = count($arrSort[$key]);
foreach ( $arrSort[$key] as $i=>$sameX ) {
if($XY[1] < $sameX[1]) {
$pos = $i;
break;
}
}
array_splice($arrSort[$key], $pos, 0, array($XY));
}
}
ksort($arrSort);
$arrResult = array();
foreach ( $arrSort as $arrTmp ) {
foreach ( $arrTmp as $XY ) {
$arrResult[] = $XY;
}
}
return $arrResult;
}
$arrXY = array(
array(0, 0),
array(3, 1),
array(2, 9),
array(2, 1),
array(2, 2),
array(1, 0),
array(1, 1),
array(3, 3),
array(3, 2),
);
$arrAscXY = sortXY($arrXY);
echo "(x, y) 昇順:\n";
foreach($arrAscXY as $XY) {
list($X, $Y) = $XY;
echo "($X, $Y)\n";
}
echo "\n(0, 0) からの距離の昇順:\n";
$arrAscDist = sortXY($arrXY, true);
foreach($arrAscDist as $XY) {
list($X, $Y) = $XY;
echo "($X, $Y) distance=". round(sqrt($X*$X + $Y*$Y), 2). "\n";
}
?>
|




odz #5839() Rating1/1=1.00
(x, y) の座標情報を以下の2種類の方法で整列する機能を実現してください。
データの表現方法はタプルなり構造体/オブジェクトなり各自で適当に選んで下さい。
[ reply ]