修改数组/多维数组的值


Modify values of array / multidimensional array

目前我想将存储在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;
}

当我从查询中获取数组结果时,我调用此函数,它可以是单个项目或多个项目。

实际上它可以工作,但是有什么方法可以改进代码吗?

感谢您的回答。

是的,它肯定可以改进。在几个方面。首先,您已经复制了实际转换日期的代码。逻辑是一样的,你只是试图递归映射。第二个是你不应该用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维度