我有以下多维数组
$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;
}
这很有效,但我想知道的是,我们是否可以改进这个功能,或者更好地做到这一点?
感谢。
答案 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
}
}
}
}
}