Return array_column 从关联数组搜索最小值
Return array_column from an associative array when a search a min value
我有一个循环来填充 $positions 数组,如下所示:
array_push($positions, ["id" => $p->id, "distance"=> $distance, "date" => $p->date]);
然后我找到了这样的最小键 'distance':
$min = min(array_column($positions,'distance'));
现在我想从'distance'成立的通讯员'id'。
我该怎么做??
未测试:
$distances = array_column($positions,'distance', 'id');
$min = min($distances);
$id = array_search($min, $distances);
这会获取距离并创建一个以 id
值作为键的新数组。然后它获取最小值并使用它来搜索与其对应的键。
我不确定如果您有多个具有相同最小值的项目,结果会是什么,所以您应该测试一下。但是如果您想要所有具有最小值的 ID,您可以使用 array_keys()
和可选的 search_value
参数。
$ids = array_keys($distances, $min);
考虑使用自定义算法(这具有 n
的计算复杂度,其中使用您的方法是 2n
,因此慢 2 倍):
$positions= [...];
$min = $positions[0]['distance'];
$elements = [0];
foreach ($positions as $pos) {
if ($pos["distance"] < $min) {
$elements = [$pos];
$min = $pos["distance"];
} elseif ($pos["distance"] == $min) {
$elements[] = $pos;
}
}
但如果您确实需要 ids
,请告诉我,我会 post 其他算法。
您还可以按 id
索引,升序排序并获取第一个键:
$distances = array_column($positions, 'distance', 'id');
asort($distances);
$id = key($distances);
我有一个循环来填充 $positions 数组,如下所示:
array_push($positions, ["id" => $p->id, "distance"=> $distance, "date" => $p->date]);
然后我找到了这样的最小键 'distance':
$min = min(array_column($positions,'distance'));
现在我想从'distance'成立的通讯员'id'。
我该怎么做??
未测试:
$distances = array_column($positions,'distance', 'id');
$min = min($distances);
$id = array_search($min, $distances);
这会获取距离并创建一个以 id
值作为键的新数组。然后它获取最小值并使用它来搜索与其对应的键。
我不确定如果您有多个具有相同最小值的项目,结果会是什么,所以您应该测试一下。但是如果您想要所有具有最小值的 ID,您可以使用 array_keys()
和可选的 search_value
参数。
$ids = array_keys($distances, $min);
考虑使用自定义算法(这具有 n
的计算复杂度,其中使用您的方法是 2n
,因此慢 2 倍):
$positions= [...];
$min = $positions[0]['distance'];
$elements = [0];
foreach ($positions as $pos) {
if ($pos["distance"] < $min) {
$elements = [$pos];
$min = $pos["distance"];
} elseif ($pos["distance"] == $min) {
$elements[] = $pos;
}
}
但如果您确实需要 ids
,请告诉我,我会 post 其他算法。
您还可以按 id
索引,升序排序并获取第一个键:
$distances = array_column($positions, 'distance', 'id');
asort($distances);
$id = key($distances);