将数据合并为一致的二维结构,同时迭代单独的查询结果集

问题描述 投票:0回答:1

第一次迭代结果数组:

[
    ['id' => '25', 'distance' => 0]
]

第二次迭代结果数组:

[
    ['id' => '24', 'distance' => 0],
    ['id' => '27', 'distance' => 0],
    ['id' => '26', 'distance' => 14.568184704048],
]

我得到这个响应是因为有多个位置(多个经纬度),所以我得到两个不同的数组。如何将所有行推入单个数组?

这是我的代码:

if (
    !empty($saveArray['area'])
    && !empty($saveArray['radius'])
    || !empty($saveArray['event_name_desc'])
    || !empty($saveArray['tags'])
    || !empty($saveArray['start_date'])
    || !empty($saveArray['end_date'])
) {
    $areas = explode('|', $saveArray['area']);
    // $query = $query->where(function($query) use ($areas) {
    foreach ($areas as $are) {
        $query = Event::query();
        $latlng = explode(',', $are);
        $lat = $latlng[0];
        $lng = $latlng[1];
        $radius = $saveArray['radius'];
        $query = $query->selectRaw("id, ( 3959 * acos( cos( radians(?) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(?)) + sin( radians(?) ) * sin( radians( latitude ) ))) AS distance", [$lat, $lng, $lat])
                       ->having("distance", "<", $radius)
                       ->orderBy("distance", 'asc')
                       ->offset(0)
                       ->limit(20);
        if ($saveArray['event_name_desc']) {
            $query = $query->where('event_name', 'like', '%' . $saveArray['event_name_desc'] . '%');
            $query = $query->orWhere('event_description', 'like', '%' . $saveArray['event_name_desc'] . '%');
        }

        if ($saveArray['tags']) {
            $tags = explode(',', $saveArray['tags']);
            $query = $query->where(
                function($query) use ($tags) {
                    foreach($tags as $tag) {
                        $query->orWhere('tags', 'like', "%$tag%");
                    };
                }
            )
            ->inRandomOrder();
        }

        $events = $query->get();
        $event = json_decode(json_encode($events), true);

        $record = [];
        foreach ($event as $ls) {
            $listing['id'] = (string) $ls['id'];
            $record[] = $listing;
        }
        // $oneDimensionalArray = array_map('current', $record);
        print_r($event);
        // $multiplied = $events->map(function ($item, $key) {
        // return $item->id;
        // })->flatten();
        // print_r($multiplied);
    }
}
php arrays laravel multidimensional-array merging-data
1个回答
0
投票

如果您不打算调整

selectRaw()
子句以将
OR
与所有纬度/经度对一起使用,那么您可以继续对数据库进行迭代访问(我不建议这样做)。

在当前脚本中,

$event = json_decode(json_encode($events), true);
是关联数组的索引数组。

在进入父循环之前将

$result
声明为空数组。然后,如果您不想编写另一个循环,请使用
array_push()
并使用扩展运算符解压行。

array_push($result, ...$events);

否则,如果您要循环

$events
负载,则只需将每一行直接推入结果数组即可:
$result[] = $ls;
$ls
是现有脚本中的变量名称)。

顺便说一句,如果您需要将 lat-lng 字符串解析为单独的 float 类型值,则

sscanf()
explode()
更直接,然后手动转换。 拆分并解析字符串以创建关联数组的数组

© www.soinside.com 2019 - 2024. All rights reserved.