【问题标题】:PHP compare associative array based on conditionPHP根据条件比较关联数组
【发布时间】:2018-06-22 05:34:45
【问题描述】:

我有以下数组输出

Array
(
    [0] => Array
        (
            [id] => 1
            [bus_id] => 1
            [stop_order_id] => 14
            [bus_time] => 09:59:00
            [bus_direction] => 1
            [trip] => 1
            [created_at] => -0001-11-30 00:00:00
            [updated_at] => -0001-11-30 00:00:00
            [route_id] => 1
            [stop_id] => 8
            [stop_orders] => 14
            [route_name] => Sydney
            [seo_url] => sydney
            [stop_name] => stop_8
            [bus_name] => M.S
            [bus_number] => 
            [bus_image] => 
            [bus_stop_start] => 
            [bus_stop_end] => 
        )

    [1] => Array
        (
            [id] => 1
            [bus_id] => 1
            [stop_order_id] => 22
            [bus_time] => 10:50:00
            [bus_direction] => 1
            [trip] => 1
            [created_at] => -0001-11-30 00:00:00
            [updated_at] => -0001-11-30 00:00:00
            [route_id] => 1
            [stop_id] => 18
            [stop_orders] => 22
            [route_name] => Sydney
            [seo_url] => sydney
            [stop_name] => stop_18
            [bus_name] => M.S
            [bus_number] => 
            [bus_image] => 
            [bus_stop_start] => 
            [bus_stop_end] => 
        )

    [2] => Array
        (
            [id] => 1
            [bus_id] => 1
            [stop_order_id] => 22
            [bus_time] => 10:55:00
            [bus_direction] => 2
            [trip] => 1
            [created_at] => -0001-11-30 00:00:00
            [updated_at] => -0001-11-30 00:00:00
            [route_id] => 1
            [stop_id] => 18
            [stop_orders] => 22
            [route_name] => Sydney
            [seo_url] => sydney
            [stop_name] => stop_18
            [bus_name] => M.S
            [bus_number] => 
            [bus_image] => 
            [bus_stop_start] => 
            [bus_stop_end] => 
        )

    [3] => Array
        (
            [id] => 1
            [bus_id] => 1
            [stop_order_id] => 14
            [bus_time] => 11:58:00
            [bus_direction] => 2
            [trip] => 1
            [created_at] => -0001-11-30 00:00:00
            [updated_at] => -0001-11-30 00:00:00
            [route_id] => 1
            [stop_id] => 8
            [stop_orders] => 14
            [route_name] => Sydney
            [seo_url] => sydney
            [stop_name] => stop_8
            [bus_name] => M.S
            [bus_number] => 
            [bus_image] => 
            [bus_stop_start] => 
            [bus_stop_end] => 
        )

    [4] => Array
        (
            [id] => 2
            [bus_id] => 2
            [stop_order_id] => 14
            [bus_time] => 10:05:00
            [bus_direction] => 1
            [trip] => 1
            [created_at] => -0001-11-30 00:00:00
            [updated_at] => -0001-11-30 00:00:00
            [route_id] => 1
            [stop_id] => 8
            [stop_orders] => 14
            [route_name] => Sydney
            [seo_url] => sydney
            [stop_name] => stop_8
            [bus_name] => J.S
            [bus_number] => 
            [bus_image] => 
            [bus_stop_start] => 
            [bus_stop_end] => 
        )

    [5] => Array
        (
            [id] => 2
            [bus_id] => 2
            [stop_order_id] => 22
            [bus_time] => 10:55:00
            [bus_direction] => 1
            [trip] => 1
            [created_at] => -0001-11-30 00:00:00
            [updated_at] => -0001-11-30 00:00:00
            [route_id] => 1
            [stop_id] => 18
            [stop_orders] => 22
            [route_name] => Sydney
            [seo_url] => sydney
            [stop_name] => stop_18
            [bus_name] => J.S
            [bus_number] => 
            [bus_image] => 
            [bus_stop_start] => 
            [bus_stop_end] => 
        )

    [6] => Array
        (
            [id] => 2
            [bus_id] => 2
            [stop_order_id] => 22
            [bus_time] => 10:58:00
            [bus_direction] => 2
            [trip] => 1
            [created_at] => -0001-11-30 00:00:00
            [updated_at] => -0001-11-30 00:00:00
            [route_id] => 1
            [stop_id] => 18
            [stop_orders] => 22
            [route_name] => Sydney
            [seo_url] => sydney
            [stop_name] => stop_18
            [bus_name] => J.S
            [bus_number] => 
            [bus_image] => 
            [bus_stop_start] => 
            [bus_stop_end] => 
        )

    [7] => Array
        (
            [id] => 5
            [bus_id] => 5
            [stop_order_id] => 27
            [bus_time] => 11:07:00
            [bus_direction] => 1
            [trip] => 1
            [created_at] => -0001-11-30 00:00:00
            [updated_at] => -0001-11-30 00:00:00
            [route_id] => 2
            [stop_id] => 8
            [stop_orders] => 5
            [route_name] => Melbone
            [seo_url] => Melbone
            [stop_name] => stop_8
            [bus_name] => R.S
            [bus_number] => 
            [bus_image] => 
            [bus_stop_start] => 
            [bus_stop_end] => 
        )

    [8] => Array
        (
            [id] => 5
            [bus_id] => 5
            [stop_order_id] => 32
            [bus_time] => 12:50:00
            [bus_direction] => 1
            [trip] => 1
            [created_at] => -0001-11-30 00:00:00
            [updated_at] => -0001-11-30 00:00:00
            [route_id] => 2
            [stop_id] => 18
            [stop_orders] => 10
            [route_name] => Melbone
            [seo_url] => Melbone
            [stop_name] => stop_18
            [bus_name] => R.S
            [bus_number] => 
            [bus_image] => 
            [bus_stop_start] => 
            [bus_stop_end] => 
        )

)

所以在这个数组中我试图根据几个条件对数组进行分组 1) 获取 buses stop_name=Stop_kstop_name=Stop_stripbus_directionstop_name=Stop_kstop_name=Stop_s 中必须相同

我已经厌倦了制作新数组,但看起来它对我来说变得很复杂

  $busGroup=[];

        foreach ($response as  $key=>$value){
            if(!in_array($value->bus_name,$busGroup)){
                $busGroup[$value->bus_name][$value->trip][$value->bus_direction][]=$value->toArray();
            }
        }

谁能帮我让它工作。谢谢。 由于我尝试使用查询获得结果但未能成功。我对此已有一个问题 MYSQL AND query to satisfy on same column

即使我在查询中得到相同的结果,我也可以接受它

更新

我在 laravel 中的查询

$response=BusTimingModel::join('stop_orders','stop_orders.id','=','bus_timings.stop_order_id')
            ->join('routes','stop_orders.route_id','=','routes.id')
            ->join('stops','stop_orders.stop_id','=','stops.id')

            ->join('buses','buses.id','=','bus_timings.bus_id')
            ->whereIn('stops.stop_name',['stop_8', 'Stop_18'])

            ->get();

我也尝试过以下查询

$response=BusTimingModel::join('stop_orders','bus_timings.stop_order_id','=','stop_orders.id')
            ->join('routes','stop_orders.route_id','=','routes.id')
            ->join('stops','stop_orders.stop_id','=','stops.id')

            ->join('buses','buses.id','=','bus_timings.bus_id')
            ->whereIn('stops.stop_name',['stop_8', 'stop_18'])
            ->havingRaw('bus_timings.bus_time BETWEEN CAST("01:59:00" AS time) AND CAST("12:00:00" AS time)')

            ->get();

预期结果 当用户在源到目的地之间搜索以及时间时,应用程序应该返回源和目的地之间的所有公共汽车旅行(例如,如果用户选择长时间

如果我谈到数组结果,我需要根据几个条件按总线分组,例如相同的总线名称必须同时具有 [stop_name] => Stop_8[stop_name] => Stop_18[trip][bus_direction] 必须在 [stop_name] => Stop_8[stop_name] => Stop_18

此处更新问题

这里附上sql文件的链接

https://github.com/codeforfungit/bustiming

【问题讨论】:

  • 结果从何而来?我猜他们来自 db。
  • @Amin.Ya 你是对的。我会更新我的查询。
  • 如果你发布一个预期结果的例子会很好。
  • @Laerte.Ya 我已经更新了我的问题
  • 什么是 Stop_k 和 Stop_s。

标签: php mysql arrays laravel


【解决方案1】:

试试这个:

$response=BusTimingModel::
        join('stop_orders','stop_orders.id','=','bus_timings.stop_order_id')
        ->join('routes','stop_orders.route_id','=','routes.id')
        ->join('stops','stop_orders.stop_id','=','stops.id')
        ->join('buses','buses.id','=','bus_timings.bus_id')
        ->where([['trip','=','bus_direction'],['stops.stop_name','=',$Stop_k]])
        ->orWhere([['trip','=','bus_direction'],['stops.stop_name','=',$Stop_s])
        ->get();

当然它可能会更好,但现在虽然我没有足够的信息,但还不错!

【讨论】:

  • @Amin.Thanks for anwer.in where condtion I can't hard code bus direction because a bus has multiple trips in day and every trip will have direction(这里的方向意味着墨尔本到悉尼1和悉尼到梅尔本 2 这意味着反之亦然)
  • @如果我在 where 条件下删除旅行,那么我会得到相同的结果,如果您需要更多详细信息,您可以查看我之前的问题。非常感谢您的努力
  • 获取 $Stop_s 和 $Stop_k 表单用户。这不是硬编码!
  • @Amin. 是的,你是对的,但说的是旅行','=','bus_direction' 我不能硬编码
  • 对不起!如果我犯了错误,则对应于我从您的数据库中获取的信息不足。您可以对数组进行操作的任何方式。虽然那是错误的方式。在 for 循环中检查方向 = 行程,如果没有取消设置成员表单数组。
猜你喜欢
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 2014-10-24
  • 1970-01-01
  • 2012-12-06
  • 2014-08-08
  • 1970-01-01
  • 2015-06-24
相关资源
最近更新 更多