Heim  >  Artikel  >  Backend-Entwicklung  >  一个算法问题,求大神指点思路

一个算法问题,求大神指点思路

WBOY
WBOYOriginal
2016-08-18 09:15:28939Durchsuche

一个算法问题,求大神指点思路

如上图,有一个房间,进入房间时间是一条记录,出去时间是一条记录,每个用户的记录都是不同的,怎么把用户在房间时间段的弄成下面这种数组形式,数据库存储的记录是这样的
['id'=>1,'uid'=>22,'stauts'=>'离开','time'=>1415947332]
['id'=>2,'uid'=>22,'stauts'=>'进入','time'=>1415947333]
['id'=>3,'uid'=>22,'stauts'=>'离开','time'=>1415997332]
['id'=>4,'uid'=>22,'stauts'=>'进入','time'=>1416947333]
['id'=>6,'uid'=>23,'stauts'=>'离开','time'=>1415947332]
['id'=>7,'uid'=>23,'stauts'=>'进入','time'=>1415947333]
['id'=>8,'uid'=>23,'stauts'=>'离开','time'=>1415997332]
['id'=>9,'uid'=>23,'stauts'=>'进入','time'=>1416947333]
...

<code>$data=[
    [0]=>[
        'begin_time'=>第一个进入时间,
        'end_time'=>第一个出去时间,
    ],
    [1]=>[
        'begin_time'=>第二个进入时间,
        'end_time'=>第二个出去时间,
    ],
    [2]=>[
        'begin_time'=>第三个进入时间,
        'end_time'=>第三个进出去时间,
    ],
    [3]=>[
        'begin_time'=>第四个进入时间,
        'end_time'=>第四个进出去时间,
    ]

.....
</code>

]

回复内容:

一个算法问题,求大神指点思路

如上图,有一个房间,进入房间时间是一条记录,出去时间是一条记录,每个用户的记录都是不同的,怎么把用户在房间时间段的弄成下面这种数组形式,数据库存储的记录是这样的
['id'=>1,'uid'=>22,'stauts'=>'离开','time'=>1415947332]
['id'=>2,'uid'=>22,'stauts'=>'进入','time'=>1415947333]
['id'=>3,'uid'=>22,'stauts'=>'离开','time'=>1415997332]
['id'=>4,'uid'=>22,'stauts'=>'进入','time'=>1416947333]
['id'=>6,'uid'=>23,'stauts'=>'离开','time'=>1415947332]
['id'=>7,'uid'=>23,'stauts'=>'进入','time'=>1415947333]
['id'=>8,'uid'=>23,'stauts'=>'离开','time'=>1415997332]
['id'=>9,'uid'=>23,'stauts'=>'进入','time'=>1416947333]
...

<code>$data=[
    [0]=>[
        'begin_time'=>第一个进入时间,
        'end_time'=>第一个出去时间,
    ],
    [1]=>[
        'begin_time'=>第二个进入时间,
        'end_time'=>第二个出去时间,
    ],
    [2]=>[
        'begin_time'=>第三个进入时间,
        'end_time'=>第三个进出去时间,
    ],
    [3]=>[
        'begin_time'=>第四个进入时间,
        'end_time'=>第四个进出去时间,
    ]

.....
</code>

]

<code><?php $data = [];
$status = ['离开'=>'end_time','进入'=>'begin_time'];
$results = [
['id'=>1,'uid'=>22,'status'=>'离开','time'=>1415947332],
['id'=>2,'uid'=>22,'status'=>'进入','time'=>1415947333],
['id'=>3,'uid'=>22,'status'=>'离开','time'=>1415997332],
['id'=>4,'uid'=>22,'status'=>'进入','time'=>1416947333],
['id'=>6,'uid'=>23,'status'=>'离开','time'=>1415947332],
['id'=>7,'uid'=>23,'status'=>'进入','time'=>1415947333],
['id'=>8,'uid'=>23,'status'=>'离开','time'=>1415997332],
['id'=>9,'uid'=>23,'status'=>'进入','time'=>1416947333],
];
foreach($results as $result){
    if(!isset($data[$result['uid']])){
        $data[$result['uid']]=[];
    }
    $data[$result['uid']] += [$status[$result['status']]=>$result['time']];
}
print_r($data);
$data = array_values($data);
print_r($data);</code>

可以循环数组,新数组以id为key保存离开和进入时间,最后再把新数组去掉key就可以得到你要的格式了。 但这样需要查询出来所有的数据

<code><?php $data = ['id'=>1,'stauts'=>'离开','time'=>1415947332],['id'=>1,'stauts'=>'进入','time'=>1415947333];    //源数据
$result = array();
foreach($data as $tmp){
    isset($result[$tmp['id']]) or $result[$tmp['id']] = array();
    switch($tmp['status']){
        case '进入' : 
            $result[$tmp['id']]['begin_time'] = $tmp['time'];
            break;
         case '离开' : 
            $result[$tmp['id']]['end_time'] = $tmp['time'];
            break;
    }
}
print_r($result);</code>

<code><?php $results = [
['id'=>1,'uid'=>22,'status'=>'离开','time'=>1415947332],
['id'=>2,'uid'=>22,'status'=>'进入','time'=>1415947333],
['id'=>3,'uid'=>22,'status'=>'离开','time'=>1415997332],
['id'=>4,'uid'=>22,'status'=>'进入','time'=>1416947333],
['id'=>6,'uid'=>23,'status'=>'离开','time'=>1415947332],
['id'=>7,'uid'=>23,'status'=>'进入','time'=>1415947333],
['id'=>8,'uid'=>23,'status'=>'离开','time'=>1415997332],
['id'=>9,'uid'=>23,'status'=>'进入','time'=>1416947333],
];
$data=array();
array_sort($results,'time','asc');
foreach($results as $res){
    if($res['status']=='进入'){
        foreach($results as $res1){
            if($res1['status']=='离开' && $res['time']$res['time'],
                    'end_time'=>$res1['time'],);
                       break;
            }
        }
    }
}
var_dump($data);
</code>

大体思路应该是这样,这个多次循环比较耗时,数据多的时候会很慢,有更优化的方法,例如第二层循环的进入先删掉,和某列匹配掉后,unset掉,当然,这要建立在第二层循环的数组和第一层的数组分离开

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn