2013-08-13 2 views
0

У меня есть сценарий, который получает всевозможные различные массивы данных из веб-интерфейса. Эта программа возвращает все даты в формате ISO 8601 (2013-08-12T09: 00: 00: 000-0600). У меня есть функция, которая легко преобразует их в временную метку unix, но я должен каждый раз представлять поле значений этой функции, которая может стать утомительной.Преобразование iso 8601 временных меток в временную метку unix в многомерном массиве в PHP

Уловка в зависимости от того, какую операцию я запускаю в то время, массив ответов из веб-приложения будет совсем другим. Одномерные и многомерные. Есть также многочисленные ключевые имена для держателей дат.

Итак, есть ли способ легко представить полный массив данных функции, которая будет искать временные метки ISO и преобразовать их в временную метку unix на месте, возвращая тот же массив с пометкой временных меток?

Вот функция я использую, чтобы преобразовать их один на один раз:

function tstamptotime($tstamp) 
{ 
    // converts ISODATE to unix date 
    // 1984-09-01T14:21:31Z 
    sscanf($tstamp, "%u-%u-%uT%u:%u:%uZ", $year, $month, $day, $hour, $min, $sec); 
    $newtstamp = mktime($hour, $min, $sec, $month, $day, $year); 
    return $newtstamp; 
} 

Вот что я придумал, но я понял, что эта идея не будет принимать во внимание многомерных массивов, а хитрость заключается в том, что массив может быть от 2-25 уровней в глубину:

foreach($results['data'] as $key => $value) { 
      if(strpos($key,'Date') !== false) { 
       if(strlen($value) == 28) { 
        $results['data'][$key] = tstamptotime($value); 
       } 
      } 
     } 

Как вы можете видеть, ключ значение всегда будет содержать слово «Date» как часть имени ключа.

Если это помогает, массив результатов «[data]] в моем примере исходит из строки json, где я использую json_encode для создания массива. Поэтому у меня есть все значения в текстовом виде, если что-то можно сделать там.

Спасибо!

ответ

0
$res = $results['data']; 
array_walk_recursive($res, function (&$e, $k){ 
    if(strpos($k, 'Date') !== false) { 
     if(strlen($e) == 28) { 
      sscanf($e, "%u-%u-%uT%u:%u:%uZ", $year, $month, $day, $hour, $min, $sec); 
      $e = mktime($hour, $min, $sec, $month, $day, $year); 
     } 
    } 
}); 
$results['data'] = $res; 

Поскольку я не знаю, что выглядит ваши данные, как, я использовал следующее испытание:

$results['info'] = array('some','info','here'); 
$results['data'][] = array('Date1' => '2013-08-09T09:00:00:000-0600'); 
$results['data'][] = array('Date2' => '2013-08-10T09:30:00:000-0600'); 
$results['data'][] = array('Date3' => '2013-08-11T09:45:00:000-0600'); 
$results['data'][] = array('Date4' => '2013-08-12T10:05:00:000-0600'); 
$results['data']['nested'][] = array('Date1' => '2013-08-09T09:00:00:000-0600'); 
$results['data']['nested'][] = array('Date2' => '2013-08-10T09:30:00:000-0600'); 
$results['data']['nested'][] = array('Date3' => '2013-08-11T09:45:00:000-0600'); 
$results['data']['nested'][] = array('Date4' => '2013-08-12T10:05:00:000-0600'); 

Выход:

Array(
    [info] => Array(
      [0] => some 
      [1] => info 
      [2] => here 
     ) 
    [data] => Array(
      [0] => Array(
        [Date1] => 1376049600 
       ) 
      [1] => Array(
        [Date2] => 1376137800 
       ) 
      [2] => Array(
        [Date3] => 1376225100 
       ) 
      [3] => Array(
        [Date4] => 1376312700 
       ) 
      [nested] => Array(
        [0] => Array(
          [Date1] => 1376049600 
         ) 
        [1] => Array(
          [Date2] => 1376137800 
         ) 
        [2] => Array(
          [Date3] => 1376225100 
         ) 
        [3] => Array(
          [Date4] => 1376312700 
         ) 
       ) 
     ) 
) 
+0

Закрыть. Он просматривает массив и выполняет преобразование времени, но он никогда не сохраняет новый номер обратно в массив, перезаписывая метку времени ISO. Если я эхо «$ e», это правильная метка времени, просто нужно выяснить, как заставить ее заменить метку времени ISO. – Josh

+0

@Josh - Я не знаю точно, что вы имеете в виду, но я исправил пару опечаток и обновил свой ответ с образцовыми данными. Можете ли вы уточнить, что вы имеете в виду, перезаписав tiemstamp? –

+0

Да, я нашел опечатку. Возможно, это факт, что почти 1 час ночи, но я его переделал, и он работает. Потрясающие! Благодаря! – Josh

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