我有以下数组:
$i=0;
while($row = mysqli_fetch_assoc($result)) {
$array[] = $row;
$array[$i]["distance"] = distance($row["latitude"], .. etc ); //distance function
我尝试使用uasort()获得最小值:
function sort_by_orden ($a, $b) {
return $a["distance"] > $b["distance"];
}
uasort ($array, 'sort_by_orden');
然后他返回了所需的内容..计算数组中对象之间的距离的最小值。
但是我在返回数据的方式上存在以下问题:
Array
(
[3] => Array
(
[name] => ALEJANDRO m
[ID] => 220
[road] => Villalobos
[distance] => 2.9
)
[2] => Array
(
[name] => ALEJANDRO m
[ID] => 219
[road] => Diego Velásquez
[distance] => 3.4
)
[1] => Array
(
[name] => javier mank
[ID] => 220
[road] => Villalobos
[distance] => 4.6
)
[0] => Array
(
[name] => javier mank
[ID] => 219
[road] => Diego Velásquez
[distance] => 5.2
)
)
如您所见,数组是按距离组织的,但是我需要为每个ID返回min的值。
以这种方式,当我需要咨询最接近“ ID”的人时,我将仅返回距离的最小值,例如:
ID = 220返回:
[name] => ALEJANDRO m
[road] => Villalobos
[distance] => 2.9
我只需要获取每个ID的最小值,这就是我不知道从哪里开始的事实。
疯狂地说应该是根据您的ID知道最低距离的层,如果我咨询ID 219或220会回答最低距离..那就是我不知道如何开始的地方。我如何进行比较?
答案 0 :(得分:0)
如我所见,您只需要使用array_values重置键,然后使用$ arr [0]。
$arr = array_values($arr);
var_dump($arr[0]);
输出:
Array
(
[name] => ALEJANDRO m
[ID] => 220
[road] => Villalobos
[distance] => 2.9
)
疯狂的猜测。
// Get all ids from array
$ids = array_column($arr, "id");
foreach(array_unique($$ids) as $id){
// Create new associative array on id for later use.
$new[$id] = array_values(array_intersect_keys($arr, array_intersect($ids, [$id])));
}
$find = 219;
var_dump($new[$find]);
// This returns all 219 sorted with [0] being the closest and end() the furthest away.
答案 1 :(得分:0)
我不确定100%是否是您想要的,但是请检查一下。 它将返回按ID和距离排序的数组。
$array = array(
[
'ID' => 220,
'distance' => 5.9
],[
'ID' => 220,
'distance' => 2.9
],[
'ID' => 221,
'distance' => 3.9
],[
'ID' => 220,
'distance' => 3.9
],[
'ID' => 221,
'distance' => 1.9
],);
// Here is where the magic is done.
array_multisort(array_column($array, 'ID'), SORT_ASC,
array_column($array, 'distance'), SORT_ASC,
$array);
输出将是:
array(5) {
[0]=>
array(2) {
["ID"]=>
int(220)
["distance"]=>
float(2.9)
}
[1]=>
array(2) {
["ID"]=>
int(220)
["distance"]=>
float(3.9)
}
[2]=>
array(2) {
["ID"]=>
int(220)
["distance"]=>
float(5.9)
}
[3]=>
array(2) {
["ID"]=>
int(221)
["distance"]=>
float(1.9)
}
[4]=>
array(2) {
["ID"]=>
int(221)
["distance"]=>
float(3.9)
}
}
如果只希望ID具有最小距离,则可以将顺序更改为SORT_DESC并使用以下方法:
foreach($array as $element) {
$hash = $element['ID'];
$unique_array[$hash] = $element;
}
这将创建一个ID距离最小的新数组。
如果这不是您想要的,请向我澄清一些问题,以便为您提供正确的解决方案。 :)