整个晚上这让我疯了。基本上,我需要在清理值之后在多维数组中设置一个特定值,然后再次(可能,取决于验证;如果验证失败,则需要将值设置为空字符串)验证值之后。假设我有这个帖子数组:
$data['should']['be']['int'] = ' yjd';
用filter_var( $value, FILTER_SANITIZE_NUMBER_INT );
清理值后,我得到一个空字符串。然后我需要以某种方式将$data['should']['be']['int']
上的值设置为空字符串。
然后将此值传递给验证函数,该函数失败,导致空字符串不是整数。同样,该验证值需要在$data['should']['be']['int']
中设置为空字符串。
在整个验证过程开始之前,我将所有相关的密钥保存在一个数组中,所以当我需要清理或验证时,我已经得到了类似的东西:
$keys = array(
0 => 'should',
1 => 'be',
2 => 'int'
);
我尝试使用foreach循环中的上述键访问$data
数组,方法是引用&$data
数组来设置新值,但无法使用,无论如何我尝试了什么。以上只是一个简化的例子。整个事情是验证类的一部分,所以我不知道传递的$data
数组的确切深度。
任何指针都将非常感谢!谢谢你的帮助!
修改 以为我无法编辑帖子,但它最终只是我的互联网连接。请忽略我在下面的评论。无论如何,这是一个我尝试递归调用的方法:
protected function set_value( &$data, $value ) {
foreach( $data as &$val ) {
if( is_array( $val ) ) {
$this->set_value( $val, $value );
} else {
$val = $value;
}
}
}
为了开始循环,我做了这个:
$this->set_value( $data[$keys[0]], $value );
答案 0 :(得分:13)
你可以尝试
$data = array();
$keys = array(
0 => 'should',
1 => 'be',
2 => 'int'
);
$value = 'yjd';
echo "<pre>";
setValue($data,$keys,$value);
print_r($data);
输出
Array
(
[should] => Array
(
[be] => Array
(
[int] => yjd
)
)
)
使用的功能
function setValue(&$data, $path, $value) {
$temp = &$data;
foreach ( $path as $key ) {
$temp = &$temp[$key];
}
$temp = $value;
return $value ;
}
答案 1 :(得分:2)
您可以使用ouzo goodies:
执行此操作Arrays::setNestedValue($array, array('should', 'be', 'int'), 'value');
请参阅http://ouzo.readthedocs.org/en/latest/utils/arrays.html#setnestedvalue