【问题标题】:How to dynamically set value in multidimensional array by reference如何通过引用动态设置多维数组中的值
【发布时间】:2013-03-18 17:48:57
【问题描述】:

这让我整个晚上都发疯了。基本上,我需要在清理值之后在多维数组中设置一个特定值,然后在验证值之后再次(可能取决于验证;如果验证失败,则需要将值设置为空字符串)。假设我有这个帖子数组:

$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 );

【问题讨论】:

  • 显示更多你尝试过的代码。
  • 已删除评论,请参阅上面的编辑。

标签: php multidimensional-array pass-by-reference


【解决方案1】:

你可以试试

$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 ;
}

【讨论】:

  • 谢谢,就像一个魅力。现在我看到了它的功能。
  • 太棒了,太棒了!
  • 通用数字和关联,伟大的工作!
【解决方案2】:

您可以使用ouzo goodies

Arrays::setNestedValue($array, array('should', 'be', 'int'), 'value');

http://ouzo.readthedocs.org/en/latest/utils/arrays.html#setnestedvalue

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    相关资源
    最近更新 更多