【发布时间】:2017-06-25 19:39:49
【问题描述】:
我需要按值的“距离”对表格进行排序。
例如: 在数据库中:
1
2
3
4
5
6
我需要什么(对于一些 n 值):
如果n = 3:
3
2
4
1
5
6
如果n = 5:
5
4
6
3
2
1
【问题讨论】:
-
每次排序的规则是什么?它看起来不像“排序”
-
通过增加n与表中值的差来排序
我需要按值的“距离”对表格进行排序。
例如: 在数据库中:
1
2
3
4
5
6
我需要什么(对于一些 n 值):
如果n = 3:
3
2
4
1
5
6
如果n = 5:
5
4
6
3
2
1
【问题讨论】:
两个值之间的距离可以定义为这些值之间差异的绝对值。
因此,如果您的列被称为例如value,你可以使用ABS()函数如下,例如对于值3:
SELECT value FROM my_table ORDER BY ABS(3 - value);
这会给你这个结果:
+-------+
| value |
+-------+
| 3 |
| 2 |
| 4 |
| 1 |
| 5 |
| 6 |
+-------+
或者对于值5:
SELECT value FROM my_table ORDER BY ABS(5 - value);
这将产生:
+-------+
| value |
+-------+
| 5 |
| 4 |
| 6 |
| 3 |
| 2 |
| 1 |
+-------+
如果你想在 PHP 中进行排序,你可以这样做:
$a = [1, 2, 3, 4, 5, 6];
$n = 3;
usort($array, function($x, $y) {return(abs($n-$x) - abs($n-$y));});
【讨论】:
正如你在评论中所说:
通过增加表中n与值的差进行排序
比那样做。 :) 例如对于n=3:
SELECT * FROM SomeTable ORDER BY ABS(3 - value) ASC, value ASC;
第一个顺序是n和value之间的距离排序,第二个是value升序排序,当距离相同时。
ABS() MySQL 函数代表绝对值。您想使用它,因为差异等于例如2 和-2 距离相同,等于2。
我根据您的示例假设的二阶条件。如果您不在乎,则不需要。
【讨论】:
在 php 中,您可以执行以下操作:
$array = (1,2,3,4,5,6);
//Find index
$key = array_search(3, $array); // $key = 2;
$up = true; //flags for traversal
$down = true;
$result = array();
for($i=1; $i<= count($array); $i++)
{
if(!empty($array[$key - $i]))
{
$result[] = $array[$key - $i];
}
if(!empty($array[$key + $i]))
{
$result[] = $array[$key + $i];
}
}
print_r($result);
【讨论】:
usort($array, function($x, $y) {return(abs(3-$x) - abs(3-$y));});