重构函数以在多维数组中搜索和替换值
Refactor function to search and replace values in multidimensional array
我有以下多维数组
$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;
}
这行得通,但我想知道我们是否可以改进此功能或以更好的方式做到这一点?
谢谢。
我建议使用递归函数来检查下一个元素是否为数组,如果是则更深一层,如果下一个元素是想要的元素,则将其更改为所需的值,如下所示:
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
}
}
}
}
}
我认为在这种情况下使用 array_walk_recursive
函数是最好的解决方案:
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)
}
}
}
}
}
我有以下多维数组
$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;
}
这行得通,但我想知道我们是否可以改进此功能或以更好的方式做到这一点?
谢谢。
我建议使用递归函数来检查下一个元素是否为数组,如果是则更深一层,如果下一个元素是想要的元素,则将其更改为所需的值,如下所示:
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
}
}
}
}
}
我认为在这种情况下使用 array_walk_recursive
函数是最好的解决方案:
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)
}
}
}
}
}