Laravel 在关联数组集合上的 contains() 帮助程序,使用多个参数进行搜索

Laravel's contains() helper on Collection of associative arrays, searching with multiple arguments

我有这个精确的 GIS 坐标集合,我正在尝试使用 laravel 的包含帮助程序通过纬度和经度来查找位置匹配。集合样本为 $points:

Polygon {#16091
  #points: array:103 [
    0 => Point {#719
      +x: -93.299203918246
      +y: 44.914451664177
    }
    1 => Point {#729
      +x: -93.299203946751
      +y: 44.914492803531
    }
    2 => Point {#737
      +x: -93.299203993418
      +y: 44.914561369423
    }
    3 => Point {#738
      +x: -93.299204049158
      +y: 44.914643647233
    }
  ]
}

我的支票是 if ($points->contains($lng, $lat)) { // do something }。我没有得到任何匹配项,所以很好奇我是否可以在这种情况下使用 contains()?我知道它适用于更简单的集合。我尝试对肯定会完全匹配的内容进行硬编码(从我正在搜索的数据集中提取),但它仍然 returns 错误。另一个我还没有开始解决的问题是,来自一个设置 $lat$lng 的查询的坐标有 6 位小数 (-93.208572) 和 GIS我正在搜索的数据具有带 12 位小数的坐标 (44.174837264857)。我的理解是 contains 仍然会找到匹配项,但我想当我到达那里时我会穿过那座桥......我还尝试用键/值对拆分检查:

$lngCheck = $points->contains('x', $lng);
$latCheck = $points->contains('y', $lat);

然后检查它们是否匹配。我还是老是报错。

这可能是 Collection 的 ->first() 函数的候选对象,它根据您提供的检查在集合中找到一个对象。在这种情况下:

$exists = $polygon->points->first(function($point, $index) use ($lat, $lng){
  return $point->x == $lat && $point->y == $lng; 
  // ^ Invert if I've got my coordinates backwards.
});

if($exists){
   // Found a matching point in the collection;
} else {
  // Didn't find a matching point in the collection
}