알고리즘 문제인데 조언 부탁드립니다

WBOY
풀어 주다: 2016-08-18 09:15:28
원래의
937명이 탐색했습니다.

알고리즘 문제인데 조언 부탁드립니다

위와 같이 방에 입장한 시간이 기록이고, 방에서 나가는 시간이 기록되는 방식이 다릅니다. 배열 형식, 데이터베이스 저장된 레코드는 다음과 같습니다
['id'=>1,'uid'=>22,'stauts'=>'leave','time'=>1415947332]
['id'=>2,'uid'=>22,'stauts'=>'입력','time'=>1415947333]
['id'=>3,'uid '=>22,'stauts'=>'떠나기','시간'=>1415997332]
['id'=>4,'uid'=>22,'stauts'=> '들어가기', '시간'=>1416947333]
['id'=>6,'uid'=>23,'stauts'=>'떠나기','시간'=>1415947332]
[ 'id'=>7,'uid'=>23,'stauts'=>'입력','time'=>1415947333]
['id'=>8, 'uid'= >23,'stauts'=>'떠나기','시간'=>1415997332]
['id'=>9,'uid'=>23,'stauts'= >'입력','시간'=>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'=>'leave','time'=>1415947332]
['id'=>2,'uid'=>22,'stauts'=>'입력','time'=>1415947333]
['id'=>3,'uid '=>22,'stauts'=>'떠나기','시간'=>1415997332]
['id'=>4,'uid'=>22,'stauts'=> '들어가기', '시간'=>1416947333]
['id'=>6,'uid'=>23,'stauts'=>'떠나기','시간'=>1415947332]
[ 'id'=>7,'uid'=>23,'stauts'=>'입력','time'=>1415947333]
['id'=>8, 'uid'= >23,'stauts'=>'떠나기','시간'=>1415997332]
['id'=>9,'uid'=>23,'stauts'= >'입력','시간'=>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를 키로 사용하여 나가고 들어오는 시간을 저장합니다. 마지막으로 새 배열에서 키를 제거하여 원하는 형식을 얻습니다. 하지만 이를 위해서는 모든 데이터를 쿼리해야 합니다

<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']<$res1['time']){
                    $data[]=array('begin_time'=>$res['time'],
                    'end_time'=>$res1['time'],);
                       break;
            }
        }
    }
}
var_dump($data);
</code>
로그인 후 복사

일반적인 아이디어는 다음과 같습니다. 이 다중 루프는 시간이 많이 걸리고 데이터가 많을 때 루프의 두 번째 레이어를 먼저 삭제한 다음 설정을 해제하는 등의 더 최적화된 방법이 있습니다. 물론 특정 열과 일치시킨 후에는 두 번째 수준 루프의 배열을 첫 번째 수준의 배열과 분리해야 합니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
최신 이슈
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!