Heim >Backend-Entwicklung >PHP-Tutorial >Ein Algorithmusproblem, bitte geben Sie mir einen Rat

Ein Algorithmusproblem, bitte geben Sie mir einen Rat

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

Ein Algorithmusproblem, bitte geben Sie mir einen Rat

Wie oben gezeigt, ist der Zeitpunkt des Betretens des Raums ein Datensatz und der Zeitpunkt des Verlassens ist für jeden Benutzer unterschiedlich Array-Form, Datenbank Der gespeicherte Datensatz sieht so aus
['id'=>1,'uid'=>22,'stauts'=>'leave','time'=>1415947332]
['id '=>2,'uid'=>22,'stauts'=>'Enter','time'=>1415947333]
['id'=>3,'uid '=> 22,'stauts'=>'Leave','time'=>1415997332]
['id'=>4,'uid'=>22,'stauts'=> 'Enter', 'time'=>1416947333]
['id'=>6,'uid'=>23,'stauts'=>'Leave','time'=>1415947332]
[ 'id'=>7,'uid'=>23,'stauts'=>'Enter','time'=>1415947333]
['id'=>8, 'uid'= >23,'stauts'=>'Leave','time'=>1415997332]
['id'=>9,'uid'=>23,'stauts'= >'Enter ','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>

]

Antwortinhalt:

Ein Algorithmusproblem, bitte geben Sie mir einen Rat

Wie oben gezeigt, ist der Zeitpunkt des Betretens des Raums ein Datensatz, und der Zeitpunkt des Verlassens ist ein Datensatz. Die Zeitspanne, in der sich der Benutzer im Raum aufhält, ist unterschiedlich Array-Form, Datenbank Der gespeicherte Datensatz sieht so aus
['id'=>1,'uid'=>22,'stauts'=>'leave','time'=>1415947332]
['id '=>2,'uid'=>22,'stauts'=>'Enter','time'=>1415947333]
['id'=>3,'uid '=> 22,'stauts'=>'Leave','time'=>1415997332]
['id'=>4,'uid'=>22,'stauts'=> 'Enter', 'time'=>1416947333]
['id'=>6,'uid'=>23,'stauts'=>'Leave','time'=>1415947332]
[ 'id'=>7,'uid'=>23,'stauts'=>'Enter','time'=>1415947333]
['id'=>8, 'uid'= >23,'stauts'=>'Leave','time'=>1415997332]
['id'=>9,'uid'=>23,'stauts'= >'Enter ','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>

Sie können das Array in einer Schleife ausführen und das neue Array speichert die Ausgangs- und Eintrittszeiten mit der ID als Schlüssel. Entfernen Sie schließlich den Schlüssel aus dem neuen Array, um das gewünschte Format zu erhalten. Dafür müssen aber alle Daten abgefragt werden

<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>

Die allgemeine Idee sollte so aussehen. Diese mehreren Schleifen sind zeitaufwändig und sehr langsam, wenn viele Daten vorhanden sind. Es gibt optimiertere Methoden, z. B. das Löschen der zweiten Schleifenebene und das anschließende Deaktivieren Nach dem Abgleich mit einer bestimmten Spalte erfordert dies natürlich die Trennung des Arrays der Schleife der zweiten Ebene vom Array der ersten Ebene

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