如何以更清洁的方式格式化数组数据?

时间:2014-07-29 07:19:12

标签: php arrays formatting

我有这个方法:

private function formatCliendCardData($data) {
    $formatedData = array();

    $formatedData['first_name'] = trim($data['name']);
    $formatedData['last_name'] = trim($data['surname']);
    $formatedData['date_of_birth'] = $data['birth_year'] . '-' . sprintf("%02d", $data['birth_month_id']) . '-' . sprintf("%02d", $data['birth_day']); //[yyyy-mm-dd]
    $formatedData['sex'] = ($data['sex_id'] == 's1'? 'm' : 'f');
    $formatedData['county'] = 'Latvija'; //@TODO get real data
    $formatedData['post_index'] = (int) preg_replace( '/[^0-9]/', '', $data['post_index']);
    $formatedData['city'] = trim($data['city']);
    $formatedData['street'] = trim($data['street']);
    $formatedData['house_nr'] = trim($data['house_nr']);
    $formatedData['phone'] = trim($data['phone']);
    $formatedData['email'] = trim($data['email']);

    return $formatedData;
}

我经常遇到这个问题。我有一个大方法,只需重新格式化数据并返回它。它看起来很难看。很少有其他的方法我知道 - 只是做foreach循环,但有exeptions,所以我需要make'ifs'无论如何。在您的意见中重新格式化此类数据的更好方法是什么?

3 个答案:

答案 0 :(得分:1)

如果您有高度自定义条件来重新格式化某些数据,我认为您没有任何其他解决方案可以手动应用此条件与一些if / else或其他自定义循环。

如果没有,您有一些统一的条件来重新格式化,您可以聚合它并批量应用于您的数据。换句话说,我认为唯一的其他解决方案是:概括重新格式化操作的条件并将其应用于您的数据。

这是面向对象的方法

答案 1 :(得分:1)

我同意你好,创建一个类来处理setter中的所有格式化和验证。

class Person
{
 public function setName($name)
 {
   $this->name = trim($name);
 }
 ...
}

然后在函数中创建对象:

private function formatCliendCardData($data) {
    $person = new Person();
    $person->setName($data['name`])
    ...

答案 2 :(得分:0)

恕我直言在这些情况下,你必须减少和清理你的代码。我经常使用帮助函数来分割数据和格式化规则。

// helper function (OUTSITE YOUR CLASS)
function waterfall($input=NULL,$fns=array()){
   $input = array_reduce($fns, function($result, $fn) {
     return $fn($result);
   }, $input);
   return $input;
}

// your formatting rules
$rules = array(
    'first_name' => array('trim'),
    'last_name' => array('trim'),
    'date_of_birth' => array(
        'f0' => function($x){
            return sprintf("%s-%02d-%02d",
                            $x['birth_year'],
                            $x['birth_month_id'],
                            $x['birth_day']
                   );
        },
        'trim'
    ),
    'sex' => array(
        'f0' => function($x){
            if($x['sex_id'] == 's1'){
                return 'm';
            }else{
                return 'f';
            }
        }
    ),
    'post_index' => array(
        'f0' => function($x){ 
                   return (int) preg_replace('/[^0-9]/', NULL, $x); 
                },
        'trim'
    ),
    'city' => array('trim'),
    'email' => array('strtolower','trim')
);

// your data
$data = array(
    'first_name' => '  Andrea',
    'last_name' => 'Ganduglia ',
    'date_of_birth' => array(
        'birth_year' => '1899',
        'birth_month_id' => 5,
        'birth_day' => 7
    ),
    'post_index' => 'IT12100',
    'city' => 'Rome',
    'email' => 'USER@DOMAIN.tld '
);

// put all together
$formatedData = array();
foreach($data as $k => $v){
    $formatedData[$k] = waterfall($v,$rules[$k]);
}

// results
print_r($formatedData);
/*
Array
(
    [first_name] => Andrea
    [last_name] => Ganduglia
    [date_of_birth] => 1899-05-07
    [post_index] => 12100
    [city] => Rome
    [email] => user@domain.tld
)
*/