2016-02-19 2 views
2

Я работаю с отметкой времени в массиве в качестве значения, например:PHP получить ближайшую отметку времени, но меньше, чем текущая временную метка

  • 1455874500: 19/02/2016 09h35
  • 1455879600: 19/02/2016 11h00
  • 1455921300: 19/02/2016 22h35

И что я хотел бы сделать, это получить наиболее близкое метку времени из моего массива НО, если эта временная отметка выше текущего времени (ближайший> ток timestamp), получить более низкое значение.

Вот пример, чтобы проиллюстрировать мою точку зрения, это 19/02/2016 10h58, я не хочу получать 1455879600 (19/02/2016 11h00), но 1455874500 (19/02/2016 09h35) И затем, когда 19/02/2016 11h00, получить 1455879600.

я работал на этом коде:

function find_closest($id, $date_now){ 
    global $cnx; 
    $sql = "select position_history from worksheets WHERE id = $id LIMIT 1"; 

    $stmt = $cnx->prepare($sql); 
    try { 
     $stmt->execute(); 
     $result = $stmt->fetch(PDO::FETCH_OBJ); 
    } 
    catch (PDOException $e) { 
     echo $e->getMessage(); 
    } 

    $pos_lane = unserialize($result->position_history); 

    $i=0; 

    $array = array(); 

    foreach ($pos_lane as $item) { 
     // $exp[2] : timestamp 
     $exp = explode("|", $pos_lane[$i]); 
     $array[$exp[1]] = $exp[2]; 
     $i++; 
    } 

    $mostrecent = "0"; 
    foreach($array as $timestampmove) 
    { 
      if ($timestampmove > $mostrecent && $timestampmove < $date_now) { 
      $mostrecent = $timestampmove; 
      } 
    } 

    $closeto = array_search($mostrecent,$array); 

    return $closeto; 

} 

, которые направлены, чтобы выбрать самую последнюю метку времени до сегодняшнего дня, но это не похоже на работу как я хочу ...

Возможно, у вас есть лучшее решение для меня?

спасибо!

+1

вы имеете в виду что-то вроде [это] (http://sandbox.onlinephpfunctions.com/code/5b589787f5723bf20ffb6c28879763425ba75fa1) – roullie

ответ

0

Вы можете попробовать следующее:

foreach ($pos_lane as $item) { 
    // $exp[2] : timestamp 
    $exp = explode("|", $pos_lane[$i]); 
    $array[$exp[1]] = (int) $exp[2]; // <<< cast to int 
    $i++; 
} 

$mostrecent = 0; 
$closeto = null; 
foreach($array as $key => $timestampmove) 
{ 
    if ($timestampmove < $date_now) { // <<< make sure $date_now is a Unix timestamp 
     if ($mostrecent < $timestampmove) { 
      $mostrecent = $timestampmove; 
      $closeto = $key; 
     } 
    } 
} 

return $closeto; 
+0

Благодарим вас за ответ, кажется, он работает очень хорошо!;) – FabriceDouceur

1

Почему бы не упростить и выполнить оригинальный запрос sql для вас?

$sql = "select MAX(position_history) from worksheets WHERE id = $id and position_history < now() LIMIT 1"; 
+0

Спасибо за ответ, но я забыл чтобы сказать, что ... Мои метки времени, которые находятся в position_history, сериализованы, вот почему я делаю взрыв («ORIGIN | DESTINATION | TIMESTAMP»), чтобы получить мою метку времени ($ exp [2]) ... :( – FabriceDouceur

Смежные вопросы