修改数组/多维数组的值

时间:2016-03-14 14:05:02

标签: php

目前我希望将存储在mysql(dateime)中的转换日期改为FR格式,这是我当前的函数:

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 个答案:

答案 0 :(得分: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维度