重构函数来搜索和替换多维数组中的值

时间:2016-01-29 12:46:05

标签: php arrays multidimensional-array refactoring

我有以下多维数组

$results = array(
    'name'     => 'signed_contract_message',
    'required' => ':min',
    'filters'  => array(
        array('name' => 'StripTags'),
        array('name' => 'StringTrim')
    ),
    'validators' => array(
        array('name' => ':max'),
        array(
            'name'    => 'StringLength',
            'options' => array(
                'encoding' => 'UTF-8',
                'min'      => ':min',
                'max'      => ':max',
                'values' => array(
                    'option_1' => ':min',
                    'option_2' => ':max'
                )
            )
        )
    )
);

我想搜索并替换存储在以下数组中的:min:max的出现次数

$placeHolders = array(':min' => 2, ':max' => 100);

我创建了以下功能来完成这项工作

function searchAndReplacePlaceHolders($results, $placeHolders)
{
    foreach ($results as $key => $result) {
        if (is_string($result) && array_key_exists($result, $placeHolders)) {
            $results[$key] = $placeHolders[$result];
        }
        if (is_array($result)) {
            foreach ($result as $key1 => $result1) {
                if (is_string($result1) && array_key_exists($result1, $placeHolders)) {
                    $results[$key][$key1] = $placeHolders[$result];
                }
                if (is_array($result1)) {
                    foreach ($result1 as $key2 => $result2) {
                        if (is_string($result2) && array_key_exists($result2, $placeHolders)) {
                            $results[$key][$key1][$key2] = $placeHolders[$result2];
                        }
                        if (is_array($result2)) {
                            foreach ($result2 as $key3 => $result3) {
                                if (is_string($result3) && array_key_exists($result3, $placeHolders)) {
                                    $results[$key][$key1][$key2][$key3] = $placeHolders[$result3];
                                }
                            }
                            if (is_array($result3)) {
                                foreach ($result3 as $key4 => $result4) {
                                    if (is_string($result4) && array_key_exists($result4, $placeHolders)) {
                                        $results[$key][$key1][$key2][$key3][$key4] = $placeHolders[$result4];
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return $results;
}

这很有效,但我想知道的是,我们是否可以改进这个功能,或者更好地做到这一点?

感谢。

2 个答案:

答案 0 :(得分:3)

我认为在这种情况下使用array_walk_recursive($results, function(&$v, $k, $ph){ if (is_string($v) && array_key_exists($v, $ph)) { $v = $ph[$v]; } }, $placeHolders); 函数将是最佳解决方案:

// the final output is shown below:   

 array(4) {
  ["name"]=>
  string(23) "signed_contract_message"
  ["required"]=>
  int(2)
  ["filters"]=>
  array(2) {
    [0]=>
    array(1) {
      ["name"]=>
      string(9) "StripTags"
    }
    [1]=>
    array(1) {
      ["name"]=>
      string(10) "StringTrim"
    }
  }
  ["validators"]=>
  array(2) {
    [0]=>
    array(1) {
      ["name"]=>
      int(100)
    }
    [1]=>
    array(2) {
      ["name"]=>
      string(12) "StringLength"
      ["options"]=>
      array(4) {
        ["encoding"]=>
        string(5) "UTF-8"
        ["min"]=>
        int(2)
        ["max"]=>
        int(100)
        ["values"]=>
        array(2) {
          ["option_1"]=>
          int(2)
          ["option_2"]=>
          int(100)
        }
      }
    }
  }
}
require(datasets)
data(swiss)
require(GGally)
require(ggplot2)
ggpairs(swiss, lower = list(continuous = "smooth", params = c(method = "loess")))

答案 1 :(得分:0)

我建议使用一个递归的functoin来检查下一个元素是否是一个数组,如果是这样的话会更深一层,如果下一个元素是想要的那个,那就改变它所需要的值如下:

function recurseArray(&$array, $val)
{
    if(is_array($array))
    {
        foreach($array as $key=>&$arrayElement)
        {
            if(is_array($arrayElement))
            {
                recurseArray($arrayElement, $val);
            }
            else
            {
                if($arrayElement == $val)
                {
                    //do your magic
                }
            }
        }
    }
}