2016-03-14 3 views
1

В настоящее время я хочу преобразовать даты хранятся в MySQL (dateime) в формат FR, вот моя текущая функция:значение Modify из массива/многомерного массива

public static function convert_dates($result){ 
    foreach ($result as $key => $value){ 
      if (count($result) != count($result, COUNT_RECURSIVE)){ 
       foreach ($result[$key] as $key2 => $value2){ 
        if(preg_match('#date#', $key2) && !empty($value2) && $value2!='0000-00-00'){ 
         if (preg_match("#^\d{4}\-\d{2}-\d{2}$#", $value2)) { 
           $result[$key][$key2] = date("d/m/Y", strtotime($value2)); 
         }elseif (preg_match("#^\d{4}\-\d{2}-\d{2} \d{2}\:\d{2}:\d{2}$#", $value2)) { 
           $result[$key][$key2] = date("d/m/Y H:i:s", strtotime($value2)); 
         } 
        } 
       } 
      }else{ 
       if(preg_match('#date#', $key) && !empty($value) && $value!='0000-00-00'){ 
        if (preg_match("#^\d{4}\-\d{2}-\d{2}$#", $value)) { 
          $result[$key] = date("d/m/Y", strtotime($value)); 
        }elseif (preg_match("#^\d{4}\-\d{2}-\d{2} \d{2}\:\d{2}:\d{2}$#", $value)) { 
          $result[$key] = date("d/m/Y H:i:s", strtotime($value)); 
        } 
       } 
      } 

    } 
    return $result; 
} 

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

На самом деле это работает, но есть ли способ улучшить код?

Спасибо за ответы.

ответ

1

Да, это, безусловно, может быть улучшено. В нескольких отношениях. Кулак состоит в том, что вы продублировали код для фактического преобразования дат. Логика такая же, вы просто пытаетесь отобразить рекурсивно. Во-вторых, вы не должны использовать if (count($result) != count($result, COUNT_RECURSIVE)), чтобы проверить, является ли это массивом, вы должны использовать if (is_array($result)). В-третьих, хотя это кажется менее важным, вы, вероятно, должны хранить свои даты как объекты DateTime, а не как строки. Но на этот раз мы будем игнорировать это, вы можете улучшить это позже. Таким образом, улучшенная версия кода будет

function transformDate($value) { 
    if (preg_match("#^\d{4}\-\d{2}-\d{2}$#", $value)) { 
     return date("d/m/Y", strtotime($value)); 
    } elseif (preg_match("#^\d{4}\-\d{2}-\d{2} \d{2}\:\d{2}:\d{2}$#", $value)) { 
     return date("d/m/Y H:i:s", strtotime($value)); 
    } 

    return $value; 
} 

public static function convert_dates($result) { 
    foreach ($result as $key => $value) { 
     if (is_array($value)) { 
      //Have this function call itself reccursively 
      $result[$key] = self::convert_dates($value); 
     } else if (preg_match('#date#', $key) && !empty($value) && $value!='0000-00-00') { 
      $result[$key] = transformDate($value); 
     } 
    } 

    return $result; 
} 

Я хотел бы предложить использовать функцию array_map вместо фактического изменения массива непосредственно, но это поддержка ключей не выглядит как его хорошо документированы. Это должно обрабатывать более двухмерных массивов, так как оно должно проходить вниз n Размеры

+0

Спасибо, хорошо выглядит! – Zeta

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