PHP:返回每个键的数组的最小值

时间:2018-08-19 19:11:13

标签: php arrays

我有以下数组:

$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会回答最低距离..那就是我不知道如何开始的地方。我如何进行比较?

2 个答案:

答案 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距离最小的新数组。

如果这不是您想要的,请向我澄清一些问题,以便为您提供正确的解决方案。 :)